题目分析
贪心练手好题。
首先,国际象棋中象的走法是斜着走,也就是这样:
通过上面的图我们不难看出,如果一个象在黑格,另外一个在白格,那么它们之间一定不会互相攻击到。
我们通过染色来确定格子的黑白颜色,一种判定方式是横纵坐标相加,偶数为黑,奇数为白。
然后我们贪心的找出最大收益,即分别找出放在黑格子与白格子的收益,然后两边各取最大值相加即可。
贴上代码
#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();
}
标签:p2,p1,int,题解,CF463C,getchar,buf,define
From: https://www.cnblogs.com/yizhixiaoyun/p/16799109.html