Codeforces Round #264 (Div. 2) C

題目:

C. Gargari and Bishops
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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).

Input

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.

Output

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.

Sample test(s)
input
4
1 1 1 1
2 1 1 0
1 1 1 0
1 0 0 1
output
12
2 2 3 2



題意分析:


給你一個n*n的格子,每一個格子都有一個數值!將兩隻bishops放在某一個格子上,每一個bishop可以攻擊對角線上的格子(主對角線和者斜對角線),然後會獲得格子上的數值(只能獲取一次)。要求輸出兩個bishops獲取的最大值以及它們所在的位置!

思路:暴力吧,首先我們都知道每一條主對角線上的橫縱座標的和相同,每一條副對角線上的橫縱座標的差相同!那麼我們在輸入的時候就可以將所有對角線上的數值之和求出來了。 最後我們發現如果要獲得最大值,那麼還有一條就是兩個bishops所在的對角線不能相交在同一個格子上。只要滿足兩個bishops的哼縱座標之和互爲奇偶就行了。在所有格子中找到橫縱座標之和爲奇數並且獲得對角線上數值最大的格子和橫縱座標之和爲偶數並且獲得對角線上數值最大的格子。二者最大獲得值相加就是最終的答案了。 比賽沒什麼好的思路,現在補上。很不錯的題目



代碼:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 2005
using 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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章