Lightoj 1010 - Knights in Chessboard (胡搞)
2015-07-14 20:57
260 查看
题目连接:
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,不可能出现相邻列的马相互攻击。
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,不可能出现相邻列的马相互攻击。
#include <bits/stdc++.h> using namespace std; int main () { int t, n, m, num, l = 0; scanf ("%d", &t); while (t --) { scanf ("%d %d", &n, &m); if (n > m) swap (n, m); if (n == 1) num = m; else if (n == 2) num = n*(2*(m/4) + min(2, m%4)); else num = max (n*m/2, n*m-n*m/2); printf ("Case %d: %d\n", ++l, num); } return 0; }
相关文章推荐
- 关注分离
- POJ-1088
- 火狐浏览器同步问题
- POJ-3660(Cow Contest)——传递闭包
- background-origin 属性
- 单例模式
- FZU1515盒子中的气球,枚举法
- 解决PHP下json_decode返回NULL的问题。
- Openwrt增加内核模块
- 深入理解JavaScript原型链
- 面向对象编程之异常处理
- android layout parser
- OpenMeetings 3.0.6安装过程简述
- 深入理解JavaScript原型链
- grep命令小结
- C# 方法参数(默认参数)
- hdu 5280 Senior's Array(dp)
- css中单位px和em,rem的区别
- 【DP】poj1185
- ASCII码