题意
n * m 格子,保证互相不被攻击
思路
对于棋盘,我们会发现,如果我们只把马放在白色的方格内,则任意两个马都不会互相攻击。
这样我们有了第一种放法,全放在白格内或者全放在黑格内。
但是有一些特殊情况。
假如n=min(n,m),m=max(n,m);
如果n=1,那么我们可以在棋盘上全放上棋子。
如果n=2,那么我们可以一次把一个田字格全部放上马,然后间隔一个田字格,然后再放马。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n, m;
int solve () {
int total = n * m;
if ( n == 1 )
return m;
if ( n == 2 ) {
int sol = total / 8 * 4;
if ( total % 8 > 4 )
sol += 4;
else
sol += total % 8;
return sol;
}
int sol = total / 2;
if ( total & 1 )
sol += 1;
return sol;
}
int main () {
int T;
scanf ( "%d", &T );
for ( int ks = 1; ks <= T; ++ks ) {
scanf ( "%d%d", &n, &m );
if ( n > m )
swap ( n, m );
int sol = solve ();
printf ( "Case %d: %d\n", ks, sol );
}
return 0;
}