您的位置:首页 > 其它

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,描述了一个棋盘。

输出:

对于每个子测试点,输出一行,一个整数,为所求的答案。

样例输入:

2

1 5

2 3

样例输出:

5

4

数据范围限制:

对于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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: