首页 > 代码库 > codeforces Gargari and Bishops(很好的暴力)
codeforces Gargari and Bishops(很好的暴力)
1 /* 2 题意:给你一个n*n的格子,每一个格子都有一个数值!将两只bishops放在某一个格子上, 3 每一个bishop可以攻击对角线上的格子(主对角线和者斜对角线),然后会获得格子上的 4 数值(只能获取一次)。要求输出两个bishops获取的最大值以及它们所在的位置! 5 6 7 思路:直接暴力!....不错的暴力题目! 8 首先我们都知道每一条主对角线上的横纵坐标的和相同,每一条副对角线上的横纵坐标的差相同! 9 那么我们在输入的时候就可以将所有对角线上的数值之和求出来了! 10 11 最后我们发现如果要获得最大值,那么还有一条就是两个bishops所在的对角线不能相交在12 同一个格子上!只要满足两个bishops的哼纵坐标之和互为奇偶就可以了! 13 14 在所有格子中找到横纵坐标之和为奇数并且获得对角线上数值最大的格子和横纵坐标之15 和为偶数并且获得对角线上数值最大的格子! 16 二者最大获得值相加就是最终的答案了! 17 */18 #include<iostream>19 #include<cstring>20 #include<cstdio>21 #include<algorithm>22 #define N 200523 using namespace std;24 typedef long long LL; 25 int num[N][N];26 LL sumN[N*2], sumM[N*2];27 28 int n;29 30 int main(){31 while(scanf("%d", &n)!=EOF){32 memset(sumN, 0, sizeof(sumN));33 memset(sumM, 0, sizeof(sumM));34 for(int i=1; i<=n; ++i)35 for(int j=1; j<=n; ++j){ 36 scanf("%d", &num[i][j]);37 sumN[i+j]+=num[i][j];//横纵坐标之和为i+j的对角线的数值和 38 sumM[i-j+n]+=num[i][j];//横纵坐标之差为i-j的对角线的数值和 39 }40 41 LL maxOdd=-1, maxEvent=-1, s;42 int x1, x2, y1, y2;43 for(int i=1; i<=n; ++i)44 for(int j=1; j<=n; ++j){45 if((i+j)&1){ 46 if(maxOdd<(s=sumN[i+j]+sumM[i-j+n]-num[i][j])){47 maxOdd=s;//横纵坐标之和为奇数并且获得对角线上数值最大的格子48 x1=i;49 y1=j;50 }51 }52 else{53 if(maxEvent<(s=sumN[i+j]+sumM[i-j+n]-num[i][j])){54 maxEvent=s;//横纵坐标之和为偶数并且获得对角线上数值最大的格子55 x2=i;56 y2=j;57 }58 }59 }60 61 printf("%lld\n",maxOdd+maxEvent); 62 printf("%d %d %d %d\n", x1, y1, x2, y2);63 }64 return 0;65 }
codeforces Gargari and Bishops(很好的暴力)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。