码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces463C Gargari and Bishops(贪心)

时间:2015-06-05 12:21:42      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

CodeForces463C Gargari and Bishops(贪心)

CodeForces463C

题目大意: 
在国际象棋的棋盘上放两个主教,这个两个主教不能攻击到同一个格子,最后的得分是这两个主教的攻击的格子上的分数之和。求最大的分数。

解题思路: 
因为攻击的范围是对角线,所以两个主教一个在黑格,一个在白格。画个图就可以发现一旦一个主教放在了黑格,那么剩下的黑格是都不能在放主教的,否则就是攻击到相同的格子。所以求出每条对角线的和,通过这个得出每个格子作为主教的得分,最后黑白格分开讨论。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long ll;
const int maxn = 2e3 + 5;

int N;
ll G[maxn][maxn];
ll d1[maxn*2], d2[maxn*2];

int main () {

    while (scanf ("%d", &N) != EOF) {

        memset(d1, 0, sizeof (d1));
        memset(d2, 0, sizeof (d2));

        for (int i = 1; i <= N; i++)
            for (int j = 1; j <= N; j++) {
                scanf ("%lld", &G[i][j]);
                d1[i + j] += G[i][j];
                d2[(i - j) + N] += G[i][j];
            }

        ll odd = -1, even = -1;
        int oddx, oddy, evenx, eveny;
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {

                if ((i + j)&1) {
                    if (odd < d1[i + j] + d2[i - j + N] - G[i][j]) {
                        odd = d1[i + j] + d2[i - j + N] - G[i][j];
                        oddx = i;
                        oddy = j;
                    }
                } else {
                    if (even < d1[i + j] + d2[i - j + N] - G[i][j]) {
                        even = d1[i + j] + d2[i - j + N] - G[i][j];
                        evenx = i;
                        eveny = j;
                    }
                }
            }
        }

        printf ("%lld\n%d %d %d %d\n", odd + even, oddx, oddy, evenx, eveny);
    }
    return 0;
}

CodeForces463C Gargari and Bishops(贪心)

标签:

原文地址:http://blog.csdn.net/u012997373/article/details/46374155

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!