二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。

解题思路:

由题意知任意两块蛋糕的欧几里得距离不能等于2,也即有两组关系:(1)x1 - x2 = 2(或-2),y1 - y2 = 0;(2)y1 - y2 = 2(或-2),x1 - x2 = 0;可理解为若开始放蛋糕的位置为(x,y);则对于每一行来说(x + 2, y)处不能放蛋糕;对于每一列来说(x, y + 2)处不能放蛋糕。

一个较为简单的数学问题,举例就能发现规律,4为周期,如下图:

二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。_第1张图片

我们也可定义一个二维数组,不初始化,则其默认的值均为0;然后把不能放蛋糕的地方置为-1;最后还剩几个0就表示可以放多少的蛋糕。

方法一:

找规律,不管是行还是列,只要有一个能够被4整除,蛋糕数就为网格总数的一半;如果行跟列都不能被4整除,蛋糕数等于网格总数除以2,再加上1。

import java.util.Scanner;

public class Main {
     
    public static void main(String[] args) {
     
        Scanner sc = new Scanner(System.in);
        int H = sc.nextInt();
        int W = sc.nextInt();
        int count = 0;
        if (H % 4 == 0 || W % 4 == 0) {
     
            count = H * W / 2;
        } else {
     
            count = H * W / 2 + 1;
        }
        System.out.println(count);
    }
}

方法二:

直接递推,把所有不能放蛋糕的地方置为-1;最后还剩几个0就表示可以放多少的蛋糕。

import java.util.Scanner;

public class Main2 {
     
    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        int W = scanner.nextInt();
        int H = scanner.nextInt();
        int[][] arr = new int[W][H];//创建一个初始化为 0 的二维数组
        int count = 0;//计数器,将不能放蛋糕的地方置为 -1 ,最后剩几个 0 就意味着可以放几块蛋糕
        for (int i = 0; i < W; i++) {
     
            for (int j = 0; j < H; j++) {
     
                if (arr[i][j] == 0) {
     
                    count++;
                    if ((i + 2) < W) {
     //每一行不能放蛋糕的地方
                        arr[i + 2][j] = -1;
                    }
                    if ((j + 2) < H) {
     //每一列不能放蛋糕的位置
                        arr[i][j + 2] = -1;
                    }
                }
            }
        }
        System.out.println(count);
    }
}

你可能感兴趣的:(每日一题,动态规划,数据结构)