题目描述
作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。
首都被认为是一个占地C×C 的正方形。小 Z 希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。
输入格式
第一行三个整数 N,M,C表示地图的宽和长以及首都的边长。
接下来 N 行每行 M 个整数,表示了地图上每个地块的价值。价值可能为负数。
输出格式
一行两个整数 X,Y表示首都左上角的坐标。
输入输出样例
输入 #1
3 4 2 1 2 3 1 -1 9 0 2 2 0 1 1
输出 #1
1 2
说明/提示
对于 60\%60% 的数据,N,M≤50。
对于 90\%90% 的数据,N,M≤300。
对于 100\%100% 的数据,1≤N,M≤10^3,1≤C≤min(N,M)。
#include<bits/stdc++.h>
using namespace std;
long long a[1003][1003];
int main()
{
long long n,m,c;
cin>>n>>m>>c;
long long x,y;
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
cin>>a[i][j];
a[i][j]+=a[i][j-1];求出每一行数组的前缀和
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// {
// cout<<a[i][j]<<" ";
// }
// cout<<"\n";
// }
long long sum=0;
long long max1=-0x3f3f3f3f;
for(long long i=1;i<=n-c+1;i++)
{
for(long long j=1;j<=m-c+1;j++)//这两层循环是定位首都左上角的坐标
{
sum=0;
for(int k=0;k<c;k++)//这一层循环是每次求出c*c大小的首都
{
long long t=a[i+k][j+c-1]-a[i+k][j-1];
sum+=t;
if(sum>max1)
{
max1=sum;
x=i;
y=j;
}
}
}
}
cout<<x<<" "<<y;
return 0;
}