洛谷P2004 领地选择
-
重点:
-
如何求二维前缀和数组
map[i][j] = map[i-1][j]+map[i][j-1]-map[i-1][j-1]+map[i][j]; i和j记得从1开始,要留个边缘的0出来 -
如果求宽度为c的子矩阵的和
t = map[i+c-1][j+c-1] - map[i-1][j+c-1] - map[i+c-1][j-1] + map[i-1][j-1];知道了这两点,这题就是一个简单的前缀和问题了,详情参见: 浅谈二维前缀和
-
注水代码:
#include<iostream>
#include<algorithm>
using namespace std;
int map[1005][1005],n,m,t=-999999999,x,y,maxn,c;
/*
二位前缀和
f[i][j] = f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
*/
int main(){
freopen("data.in","r",stdin);
cin>>n>>m>>c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>map[i][j];
map[i][j] = map[i-1][j]+map[i][j-1]-map[i-1][j-1]+map[i][j];
}
for(int i=1;i<=n-c+1;i++){
for(int j=1;j<=m-c+1;j++){
t = map[i+c-1][j+c-1] - map[i-1][j+c-1] - map[i+c-1][j-1] + map[i-1][j-1];
if(t>maxn){
x = i;
y = j;
maxn = t;
}
}
}
cout<<x<<" "<<y;
return 0;
}
题面:
题目描述
作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。
首都被认为是一个占地 C\times CC×C 的正方形。小 Z 希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。
输入格式
第一行三个整数 N,M,CN,M,C,表示地图的宽和长以及首都的边长。
接下来 NN 行每行 MM 个整数,表示了地图上每个地块的价值。价值可能为负数。
输出格式
一行两个整数 X,YX,Y,表示首都左上角的坐标。
输入输出样例
输入 #1复制
3 4 2
1 2 3 1
-1 9 0 2
2 0 1 1
输出 #1复制
1 2
说明/提示
对于 60%60% 的数据,N,M\le 50N,M≤50。
对于 90%90% 的数据,N,M\le 300N,M≤300。
对于 100%100% 的数据,1\le N,M\le 10^31≤N,M≤103,1\le C\le \min(N,M)1≤C≤min(N,M)。