网站开发 开票,seo优化查询,asp access网站架设教程,南通网站排名优化报价1 /*2 题意#xff1a;给你一个n*n的格子#xff0c;每一个格子都有一个数值#xff01;将两只bishops放在某一个格子上#xff0c;3 每一个bishop可以攻击对角线上的格子#xff08;主对角线和者斜对角线#xff09;#xff0c;然后会获得格子上的4 数值给你一个n*n的格子每一个格子都有一个数值将两只bishops放在某一个格子上3 每一个bishop可以攻击对角线上的格子主对角线和者斜对角线然后会获得格子上的4 数值只能获取一次。要求输出两个bishops获取的最大值以及它们所在的位置5 6 7 思路直接暴力....不错的暴力题目 8 首先我们都知道每一条主对角线上的横纵坐标的和相同每一条副对角线上的横纵坐标的差相同9 那么我们在输入的时候就可以将所有对角线上的数值之和求出来了
10
11 最后我们发现如果要获得最大值那么还有一条就是两个bishops所在的对角线不能相交在
12 同一个格子上只要满足两个bishops的哼纵坐标之和互为奇偶就可以了
13
14 在所有格子中找到横纵坐标之和为奇数并且获得对角线上数值最大的格子和横纵坐标之
15 和为偶数并且获得对角线上数值最大的格子
16 二者最大获得值相加就是最终的答案了
17 */
18 #includeiostream
19 #includecstring
20 #includecstdio
21 #includealgorithm
22 #define N 2005
23 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 i1; in; i)
35 for(int j1; jn; j){
36 scanf(%d, num[i][j]);
37 sumN[ij]num[i][j];//横纵坐标之和为ij的对角线的数值和
38 sumM[i-jn]num[i][j];//横纵坐标之差为i-j的对角线的数值和
39 }
40
41 LL maxOdd-1, maxEvent-1, s;
42 int x1, x2, y1, y2;
43 for(int i1; in; i)
44 for(int j1; jn; j){
45 if((ij)1){
46 if(maxOdd(ssumN[ij]sumM[i-jn]-num[i][j])){
47 maxOdds;//横纵坐标之和为奇数并且获得对角线上数值最大的格子
48 x1i;
49 y1j;
50 }
51 }
52 else{
53 if(maxEvent(ssumN[ij]sumM[i-jn]-num[i][j])){
54 maxEvents;//横纵坐标之和为偶数并且获得对角线上数值最大的格子
55 x2i;
56 y2j;
57 }
58 }
59 }
60
61 printf(%lld\n,maxOddmaxEvent);
62 printf(%d %d %d %d\n, x1, y1, x2, y2);
63 }
64 return 0;
65 } 转载于:https://www.cnblogs.com/hujunzheng/p/3946876.html