牛客网在线编程:不要二
题目描述:
二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:
输出一个最多可以放的蛋糕数
示例1
输入
3 2
输出
4
思路:
1 1 * * 1 1 * *
1 1 * * 1 1 * *
* * 1 1 * * 1 1
* * 1 1 * * 1 1
*对于点的x,y坐标,如果x除4余0或者除4余1,则y除4余0或者除4余1的点flag设为1
*如果x除4余2或者除4余3则y除4余2或者除4余3的flag设置为1
*统计flag = 1的个数即可
*有简单算法,找规律,将所有点放在同一行,则问题变成了隔一个空放一个蛋糕
if(r%4==0||c%4==0){n=r*c/2;}//如果能整除4 那么蛋糕个数为网格个数的一半
else{ n=r*c/2+1;}//不能被4整除 将蛋糕每隔一个空放一个 可以放多少 奇数的一半+1
1 import java.util.*; 2 3 public class Buyaoer { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Scanner sc = new Scanner(System.in); 8 int x = sc.nextInt(); 9 int y = sc.nextInt(); 10 sc.close(); 11 //System.out.println(x); 12 //System.out.println(y); 13 int[][] flag = new int[x][y]; 14 int count = 0; 15 for(int i = 0; i < x; i++){ 16 if(i%4 == 0 || i%4 == 1){ 17 for(int j = 0; j < y; j++){ 18 if(j%4==0||j%4==1){ 19 //System.out.println(i); 20 //System.out.println(j); 21 flag[i][j] = 1; 22 count++; 23 } 24 } 25 }else { 26 for(int j=0; j<y; j++){ 27 if(j%4==2||j%4==3){ 28 //System.out.println(i); 29 //System.out.println(j); 30 flag[i][j]=1; 31 count++; 32 } 33 } 34 } 35 } 36 37 System.out.println(count); 38 } 39 40 }