Codeforces Round #264 (Div. 2) C
来源:互联网 发布:高级的数据分析算法 编辑:程序博客网 时间:2024/04/27 18:26
题目:
Gargari is jealous that his friend Caisa won the game from the previous problem. He wants to prove that he is a genius.
He has a n × n chessboard. Each cell of the chessboard has a number written on it. Gargari wants to place two bishops on the chessboard in such a way that there is no cell that is attacked by both of them. Consider a cell with number x written on it, if this cell is attacked by one of the bishops Gargari will get x dollars for it. Tell Gargari, how to place bishops on the chessboard to get maximum amount of money.
We assume a cell is attacked by a bishop, if the cell is located on the same diagonal with the bishop (the cell, where the bishop is, also considered attacked by it).
The first line contains a single integer n (2 ≤ n ≤ 2000). Each of the next n lines contains n integers aij (0 ≤ aij ≤ 109) — description of the chessboard.
On the first line print the maximal number of dollars Gargari will get. On the next line print four integers: x1, y1, x2, y2 (1 ≤ x1, y1, x2, y2 ≤ n), where xi is the number of the row where the i-th bishop should be placed, yi is the number of the column where the i-th bishop should be placed. Consider rows are numbered from 1 to n from top to bottom, and columns are numbered from 1 to n from left to right.
If there are several optimal solutions, you can print any of them.
41 1 1 12 1 1 01 1 1 01 0 0 1
122 2 3 2
题意分析:
给你一个n*n的格子,每一个格子都有一个数值!将两只bishops放在某一个格子上,每一个bishop可以攻击对角线上的格子(主对角线和者斜对角线),然后会获得格子上的数值(只能获取一次)。要求输出两个bishops获取的最大值以及它们所在的位置!
思路:暴力吧,首先我们都知道每一条主对角线上的横纵坐标的和相同,每一条副对角线上的横纵坐标的差相同!那么我们在输入的时候就可以将所有对角线上的数值之和求出来了。 最后我们发现如果要获得最大值,那么还有一条就是两个bishops所在的对角线不能相交在同一个格子上。只要满足两个bishops的哼纵坐标之和互为奇偶就行了。在所有格子中找到横纵坐标之和为奇数并且获得对角线上数值最大的格子和横纵坐标之和为偶数并且获得对角线上数值最大的格子。二者最大获得值相加就是最终的答案了。 比赛没什么好的思路,现在补上。很不错的题目
代码:
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define N 2005using namespace std;typedef long long LL;int num[N][N];LL sumN[N*2], sumM[N*2];int n;int main(){ while(scanf("%d", &n)!=EOF) { memset(sumN, 0, sizeof(sumN)); memset(sumM, 0, sizeof(sumM)); for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) { scanf("%d", &num[i][j]); sumN[i+j]+=num[i][j];//横纵坐标之和为i+j的对角线的数值和 sumM[i-j+n]+=num[i][j];//横纵坐标之差为i-j的对角线的数值和 } LL max1=-1, max2=-1, s; int x1, x2, y1, y2; for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) { if((i+j)&1) { if(max1<(s=sumN[i+j]+sumM[i-j+n]-num[i][j])) { max1=s;//横纵坐标之和为奇数并且获得对角线上数值最大的格子 x1=i; y1=j; } } else { if(max2<(s=sumN[i+j]+sumM[i-j+n]-num[i][j])) { max2=s;//横纵坐标之和为偶数并且获得对角线上数值最大的格子 x2=i; y2=j; } } } printf("%lld\n",max1+max2); printf("%d %d %d %d\n", x1, y1, x2, y2); } return 0;}
- Codeforces Round #264 (Div. 2) C
- Codeforces Round #264 (Div. 2) C
- 【codeforces】Codeforces Round #370 (Div. 2) C
- 【Codeforces Round #264 (Div. 2)】
- Codeforces Round #264 (Div. 2)
- Codeforces Round #264 (Div. 2)
- Codeforces Round #264 (Div. 2)
- Codeforces Round #264 (Div. 2)
- Codeforces Round #264 (Div. 2)
- Codeforces Round #264 (Div. 2)
- Codeforces Round #264 (Div. 2) C Gargari and Bishops 【暴力】
- Codeforces Round #264 (Div. 2)C(找规律)
- COdeforces Round #264 (Div. 2) C. Gargari and Bishops
- Codeforces Round #264 (Div. 2) C. Gargari and Bishops
- Codeforces Round #264 (Div. 2)-C. Gargari and Bishops
- Codeforces Round #264 (Div. 2) A,B,C,D,E
- Codeforces Round #264 (Div. 2) C - Gargari and Bishops
- Codeforces Round #105 (Div. 2) C
- 母函数详解
- Reverse Words in a String
- 简单的足球游戏——for循环的应用,输入输出函数的区别
- PKU ACM经典50题
- NYOJ 60 谁获得了最高奖学金【结构体】
- Codeforces Round #264 (Div. 2) C
- 异常:Only the original thread that created a view hierarchy can touch its views的解决办法
- 逆序对
- 数据库原理第一章总结
- [MySQL]-->查询5天之内过生日的同事中的跨年问题的解决过程
- 协议
- 小米笔试题
- 美国宣布转基因有毒,鉴别有方
- 搜狗2014年笔试题-两递增数组A和B,求A[i]+B[j]中前k个最小值(Java)