CF463C 题解

题目传送门

题目分析

贪心练手好题。

首先,国际象棋中象的走法是斜着走,也就是这样:

通过上面的图我们不难看出,如果一个象在黑格,另外一个在白格,那么它们之间一定不会互相攻击到。

我们通过染色来确定格子的黑白颜色,一种判定方式是横纵坐标相加,偶数为黑,奇数为白。

然后我们贪心的找出最大收益,即分别找出放在黑格子与白格子的收益,然后两边各取最大值相加即可。

贴上代码

#include<bits/stdc++.h>
#define lf i+j
#define rt i-j+2500
#define int long long
using namespace std;
static char buf[1000000],*p1=buf,*p2=buf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
inline int read(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9') {x=x*10+c-48;c=getchar();}return x*f;}
const int maxn=5002;
int n;
int tot1,tot2;
int x,y,xx,yy;
int a[maxn][maxn];
int p[maxn],q[maxn];
inline void init(){
	n=read();
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j) a[i][j]=read();
	}
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j){
			p[lf]+=a[i][j];q[rt]+=a[i][j];
		}
	}
}
inline void print(){
	cout<<tot1+tot2<<endl;
	cout<<x<<" "<<y<<" "<<xx<<" "<<yy<<" ";
}
signed main(){
	init();
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j){
			if((i+j)%2==1){
				if(tot1<=p[lf]+q[rt]-a[i][j]){
					tot1=p[lf]+q[rt]-a[i][j];
					x=i;y=j;
				}
			}
			else if(tot2<=p[lf]+q[rt]-a[i][j]){
				tot2=p[lf]+q[rt]-a[i][j];
				xx=i;yy=j;
			}
		}
	}
	print();
}
posted @ 2022-10-17 14:26  yizhixiaoyun  阅读(60)  评论(0)    收藏  举报