C. Gargari and Bishops
题意:n*n的方格,每个方格里有数。选其中两个方格,把他们斜对角线加起来,要求同一个方格不能被加两次,问最大和是多少。
思路:暴力算出每个格子的斜对角线和,(有个技巧,类似哈希,见代码)。挑行号+列号为奇数和最大的格子和行号+列号为偶数和最大的格子,就是所求。因为奇偶性不同是一个格子不被覆盖两次的充要条件。这题会卡cin。。。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
//#include <map>
#include <set>
#include <ctype.h>
#define INF 1000000010
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 1000
using namespace std;
ll map[2010][2010];
ll tmp1[4010];
ll tmp2[4010];
ll a[2010][2010];
int main(){
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
//cin>>map[i][j];
scanf("%I64d",&map[i][j]);
tmp1[i-j+n]+=map[i][j];
tmp2[j+i]+=map[i][j];
}
}
ll maxji=-1;
ll maxou=-1;
int x1,x2;
int y1,y2;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=tmp1[i-j+n]+tmp2[i+j]-map[i][j];
if((i+j)%2){
if(a[i][j]>maxou){
maxou=a[i][j];
x1=i; y1=j;
// cout<<"ou="<<a[i][j]<<" "<<i<<" "<<j<<endl;
}
}else{
if(a[i][j]>maxji){
maxji=a[i][j];
x2=i; y2=j;
}
}
}
}
cout<<maxji+maxou<<endl;
cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
return 0;
}
本文介绍了一道编程题目C.GargariandBishops的解决思路,该题要求在一个n*n的矩阵中选取两个格子,计算它们对应的斜对角线上的元素之和的最大值,同时确保这两个格子不共线。通过预先计算每个格子的斜对角线和,并区分奇偶性来避免重复选择,最终找到满足条件的最大和。
1654

被折叠的 条评论
为什么被折叠?



