kuangbin 数学训练一 Knights in Chessboard
题目链接:传送门#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define ll long longusing namespace std;int t, n, m, k, ans;int main() {scanf
·
题目链接:
传送门
#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);
}
}
}
这道题我们可以找一下规律,然后就会发现这道题我们大致可以分成三类讨论:
- 只有一行和一列的情况:
在这种情况下我们所有格子都能布满棋子。- 有两行或者两列的情况:
在这种情况下我们最佳方按就是按照一个田字的样式来摆放,如图(红色为摆放,绿色为不可摆放位置):
3.第三就是行和列都大于2的情况了:
其实摆法和2相似但是答案根据规律性,此时答案就等于整个棋盘的面积/2再向上取整即可。
更多推荐
所有评论(0)