题目连接:
http://www.lightoj.com/volume_showproblem.php?problem=1010
题目描述:
有一个n*m的棋盘,根据象棋中马走日字的规则,问此棋盘最多可以存放多少个马,并且任意两个马之间不会相互攻击。
解题思路;
从题目中给的棋盘可以看出,如果我们只把马放在白格子或者只把马放在黑格子的话都是合法的,但是是不是最优呢?
仔细考虑一下就可以得出:
当min(n, m) == 1的时候,把格子放满马也是没事的,
当min(n, m) == 2的时候,可以放满一个2*2的格子,空出来一个2*2的格子,依次到放满棋盘,因为min(n, m) == 2,不可能出现相邻列的马相互攻击。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main () 4 { 5 int t, n, m, num, l = 0; 6 scanf ("%d", &t); 7 while (t --) 8 { 9 scanf ("%d %d", &n, &m); 10 if (n > m) 11 swap (n, m); 12 if (n == 1) 13 num = m; 14 else if (n == 2) 15 num = n*(2*(m/4) + min(2, m%4)); 16 else 17 num = max (n*m/2, n*m-n*m/2); 18 printf ("Case %d: %d\n", ++l, num); 19 } 20 return 0; 21 }