题目描述
二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:
输出一个最多可以放的蛋糕数
示例1
输入
3 2
输出
4
题目链接
法一:数学,规律如下:即,每4*4的矩形框就可以分配如下的蛋糕。可以找完所有4*4的方格之后,再计算剩余多的方格可以放多少蛋糕。代码如下(耗时7ms,第一次暂居第一欸):
蛋糕 | 蛋糕 | ||
蛋糕 | 蛋糕 | ||
蛋糕 | 蛋糕 | ||
蛋糕 | 蛋糕 |
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 5 public class Main { 6 7 public static void main(String[] args) throws IOException { 8 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 9 String line = in.readLine(); 10 String[] s = line.split(" "); 11 int w = Integer.parseInt(s[0]), h = Integer.parseInt(s[1]); 12 int res = 0; 13 int w_yu = w % 4, h_yu = h % 4; 14 res = (w - w_yu) * (h - h_yu) / 2; 15 //横向多余 16 res += w_yu * (h - h_yu) / 2; 17 //竖向多余 18 res += h_yu * (w - w_yu) / 2; 19 //重叠多余 20 if(w_yu == 1 || w_yu == 2) { 21 if(h_yu == 1) { 22 res += 1 * w_yu; 23 } 24 else if(h_yu >= 2) { 25 res += 2 * w_yu; 26 } 27 } 28 else if(w_yu == 3 || w_yu == 4) { 29 if(h_yu <= 2) { 30 res += 2 * h_yu; 31 } 32 else { 33 res += (h_yu - 2) * (w_yu - 2) + 4; 34 } 35 } 36 System.out.println(res); 37 } 38 39 }