题意
给我们一个n*m的表格 告诉我们每次跳跃的格子数量s
只能垂直或者水平跳跃 可以跳跃无限次 那么某格子能到达的不同格子的数量就是这个格子的值 求表格中值最大的格子的数量
分析
表面上看像是搜索 然而1e6的数据搜索行不通
其实分析下是个规律题 也就是符合能够互相抵达的格子最多的在一个表格中是符合某种计算规律的 我们发现 任意一个表格 都可以根据不同的跳跃数量得到规律从而计算出如果在表格中尽可能放更多的石子 石子时间横竖相差s步 然后发现这样的一种放置其实就是符合条件的一种解 也就是可以互相抵达 不同长宽的表格 或许会有很多个不同的最大放置数量 所以最后再算一下倍数 然后乘上最大放置数量就可以得到解
code
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int n,m,s;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
s = sc.nextInt();
long ans = 0;
long l,w;
// 计数
if(s>=Math.max(n, m))System.out.println(1l*n*m);
else{
l = (n%s!=0?n/s+1:n/s);
w = (m%s!=0?m/s+1:m/s);
// 倍数
long lt = 0,wt=0;
if(n%s==0)lt+=s-1;
else lt+=n-(n/s)*s-1;
if(m%s==0)wt+=s-1;
else wt+=m-(m/s)*s-1;
long time = lt*wt==0?lt+wt+1:(lt+1)*(wt+1);// 如果横向可以平移最大放置策略 纵向也可以平移 那么最后的倍数是横向倍数*纵向倍数
ans = 1l*l*w*time;
System.out.println(ans);
}
}
}
最大放置多少个以及倍数之间的计算关系写错了好几次。。。