Codeforces Round #264 (Div. 2) C

本文介绍了一道编程题目C.GargariandBishops的解决思路,该题要求在一个n*n的矩阵中选取两个格子,计算它们对应的斜对角线上的元素之和的最大值,同时确保这两个格子不共线。通过预先计算每个格子的斜对角线和,并区分奇偶性来避免重复选择,最终找到满足条件的最大和。

C. Gargari and Bishops


        题意:n*n的方格,每个方格里有数。选其中两个方格,把他们斜对角线加起来,要求同一个方格不能被加两次,问最大和是多少。

        思路:暴力算出每个格子的斜对角线和,(有个技巧,类似哈希,见代码)。挑行号+列号为奇数和最大的格子和行号+列号为偶数和最大的格子,就是所求。因为奇偶性不同是一个格子不被覆盖两次的充要条件。这题会卡cin。。。


#include <iostream>         
#include <stdio.h>         
#include <cmath>         
#include <algorithm>         
#include <iomanip>         
#include <cstdlib>         
#include <string>         
#include <memory.h>         
#include <vector>         
#include <queue>         
#include <stack>         
//#include <map>       
#include <set>       
#include <ctype.h>         
#define INF 1000000010     
#define ll long long     
#define max3(a,b,c) max(a,max(b,c))     
#define MAXN 1000

using namespace std;     

ll map[2010][2010];

ll tmp1[4010];
ll tmp2[4010];

ll a[2010][2010];

int main(){
	int n;
	while(cin>>n){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				//cin>>map[i][j];
				scanf("%I64d",&map[i][j]);
				tmp1[i-j+n]+=map[i][j];
				tmp2[j+i]+=map[i][j];
			}
		}
		ll maxji=-1;
		ll maxou=-1;
		
		int x1,x2;
		int y1,y2;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				a[i][j]=tmp1[i-j+n]+tmp2[i+j]-map[i][j];
				if((i+j)%2){
					
					if(a[i][j]>maxou){
						maxou=a[i][j];
						x1=i; y1=j;
					//	cout<<"ou="<<a[i][j]<<" "<<i<<" "<<j<<endl;
					}
				}else{
					if(a[i][j]>maxji){
						maxji=a[i][j];
						x2=i; y2=j;
					}
				}
			}
		}
		
		cout<<maxji+maxou<<endl;
		cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值