题目描述
作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。
首都被认为是一个占地 C×C 的正方形。小 Z 希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。
输入格式
第一行三个整数 N,M,C,表示地图的宽和长以及首都的边长。
接下来 N 行每行 M 个整数,表示了地图上每个地块的价值。价值可能为负数。
输出格式
一行两个整数 X,Y,表示首都左上角的坐标。
思路:二维(矩阵)前缀和
很普通的矩阵前缀和,但是要注意的是,要求的矩阵的边长是有条件的,所以只需要2个for循环即可。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
in.nextToken();
int N=(int)in.nval;
in.nextToken();
int M=(int)in.nval;
in.nextToken();
int C=(int)in.nval;
int[][] sum=new int[N+1][M+1];
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
in.nextToken();
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+(int)in.nval;
}
int temp,max=0x80000000,f=0,g=0,r,b;
for(int i=1;i<=N-C+1;i++)
for(int j=1;j<=M-C+1;j++)
{
r=i+C-1;
b=j+C-1;
temp=sum[r][b]-sum[i-1][b]-sum[r][j-1]+sum[i-1][j-1];
if(temp>max)
{
f=i;
g=j;
max=temp;
}
}
pw.println(f+" "+g);
pw.flush();
}
}