题目链接:
传送门

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

int t, n, m, k, ans;

int main() {
	scanf("%d", &t);
	while(t--) {
		scanf("%d%d", &n, &m);
		//只有一行或一列的情况
		if(m == 1 || n == 1) {
			ans = max(m, n);
			printf("Case %d: %d\n", ++k, ans);
		//两行或两列的情况
		} else if(m == 2 || n == 2) {
			ans = max(m, n);
			ans = (ans / 4) * 4 + min(2, ans % 4) * 2;
			printf("Case %d: %d\n", ++k, ans);
		//其他的情况
		} else {
			printf("Case %d: %d\n", ++k, (m * n + 1) / 2);
		}
	}
}

这道题我们可以找一下规律,然后就会发现这道题我们大致可以分成三类讨论:

  1. 只有一行和一列的情况:
    在这种情况下我们所有格子都能布满棋子。
  2. 有两行或者两列的情况:
    在这种情况下我们最佳方按就是按照一个田字的样式来摆放,如图(红色为摆放,绿色为不可摆放位置):
    在这里插入图片描述
    3.第三就是行和列都大于2的情况了:
    其实摆法和2相似但是答案根据规律性,此时答案就等于整个棋盘的面积/2再向上取整即可。
Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐