• 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 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 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
    ",maxOdd+maxEvent);     
    62         printf("%d %d %d %d
    ", x1, y1, x2, y2);
    63     }
    64      return 0;
    65 } 
  • 相关阅读:
    系统操作日志设计代码实现
    SQL SERVER 存储过程复习
    IGrab信息采集系统流程图(初稿)
    收藏几段SQL语句和存储过程
    SQL Server联机丛书:存储过程及其创建
    使用dynamic来简化反射实现,并且提高了性能
    你必须知道的C#的25个基础概念(附演示)
    弹窗插件
    dede 搜索时出现“SphinxClient类找不到”解决
    开启includes模块运行shtml
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3946876.html
Copyright © 2020-2023  润新知