2017.1.14【初中部 GDKOI】模拟赛B组 心灵终结 题解
2017-01-14 15:54
197 查看
原题:
http://172.16.0.132/senior/#contest/show/1895/3题目描述:
尤里背叛了苏维埃联盟!尤里具有心灵控制的能力,可以控制我方的士兵攻击同伴。为了避免这种情况,斯大林同志要求你合理地排兵布阵,使得没有两个士兵可以互相攻击。
在这个问题里,你可以认为士兵的攻击范围类似于国际象棋中的马。也即,位置为(x,y)的士兵可以攻击位置为(x±2,y±1)或(x±1,y±2)的士兵。请计算:在N*M 的棋盘上最多能放置多少个士兵。(当然,两个士兵不能在同一个位置)
输入:
第一行,一个整数T,描述了子测试点的组数。以下T 行,每行两个整数N,M,描述了一个棋盘。
输出:
对于每个子测试点,输出一行,一个整数,为所求的答案。样例输入:
21 5
2 3
样例输出:
54
数据范围限制:
对于20%的数据:N*M≤15。对于100%的数据:1≤T≤1000,1≤N,M≤10^9。
均匀地,对于总计50%的数据:数据随机生成。
输出规模不是很大,因此cout 大法好。
分析:
对于这道题,我们可以找规律;定义:
当n=2时,ans=f(m);
当m=2时,ans=f(n);
当n=1||m=1时,ans=n*m;
否则,ans=(n*m+1)/2;
实现:
#include<iostream> #include<cstdio> using namespace std; int a[20][20],t; long long n,m; long long f(long long x) { if(x%4==0) return x; if(x%4==1) return x+1; if(x%4==2) return x+2; if(x%4==3) return x+1; } int main() { scanf("%d",&t); while(t--) { scanf("%lld%lld",&n,&m); if(n==2) { printf("%lld\n",f(m)); continue; } if(m==2) { printf("%lld\n",f(n)); continue; } if(n==1||m==1) printf("%lld\n",n*m); else printf("%lld\n",(n*m+1)/2); } }
相关文章推荐
- 2017.1.14【初中部 GDKOI】模拟赛B组 心灵终结 题解
- 2017.1.14【初中部 GDKOI】模拟赛B组 Mooo Moo 题解
- 2017.1.14【初中部 GDKOI】模拟赛B组 Mooo Moo 题解
- 2017.2.09【初中部 GDKOI】模拟赛B组 拦截导弹 题解
- 2017.2.11【初中部 GDKOI】模拟赛B组 摧毁巴士站(bus) 题解
- 2017.2.10【初中部 GDKOI】模拟赛B组 方格游戏(game) 题解
- 2017.2.10【初中部 GDKOI】模拟赛B组 运算符(calc) 题解
- 2017.1.19【初中部 GDKOI】模拟赛B组 开灯 题解
- 2017.1.14【初中部 GDKOI】模拟赛B组题解
- 2017.2.09【初中部 GDKOI】模拟赛B组 最难的问题 题解
- 2017.2.10【初中部 GDKOI】模拟赛B组题解
- 2017.1.17【初中部 GDKOI】模拟赛B组 穿越泥地 题解
- 2017.2.09【初中部 GDKOI】模拟赛B组 昵称 题解
- 2017.1.14【初中部 GDKOI】模拟赛B组
- 2017.1.17【初中部 GDKOI】模拟赛B组 修建道路 题解
- 2017.2.11【初中部 GDKOI】模拟赛B组题解
- 2017.2.11【初中部 GDKOI】模拟赛B组题解
- 2017.2.12【初中部 GDKOI】模拟赛B组 T2:宿敌
- 2016.12.17【初中部 GDKOI 】模拟赛B组