题解 CF142B 【Help General】

SIGSEGV

2019-02-23 21:09:34

Solution

首先,为了方便处理,因此要使$n > m$。先加入代码 `if (n < m) swap(n,m);` 大力分类讨论: 当m=1时(棋盘只有一行),放满; 当m=2时,按照田字格放;(即放4个空4个),看上去像这样(1:放 0:不放) | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | | -----------: | -----------: | -----------: | -----------: | -----------: | -----------: | -----------: | -----------: | -----------: | -----------: | | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 当m>2时,隔一个位置放一个,如 | 1 | 0 |1 | | -----------: | -----------: | -----------: | | 0 | 1 | 0 | | 1 | 0 | 1 | (按照国际象棋中的黑白格放) 上代码 ```cpp #include <bits/stdc++.h> using namespace std; int n,m; int main () { scanf("%d%d",&n,&m); if (n < m) swap(n,m); if (n == 1 || m == 1) printf("%d\n",n * m); //m=1 else if ((n == 2 || m == 2) && n * m != 2) //m=2 { if (n % 4 == 0) printf("%d\n",n); if (n % 4 == 3) printf("%d\n",n + 1); if (n % 4 == 2) printf("%d\n",n + 2); if (n % 4 == 1) printf("%d\n",n + 1); } else printf("%d\n",(1 + n * m) / 2); //m>2 return 0; } ```