UVA11384 (Help is needed for Dexter)[找规律,二分]

题目链接

手推前几项可以发现,第一次消一定是从数列的正中间消最优,消完这一次后中间会出现一个零,假设n是偶数,那此时两边会出现两个一样的数列,对它们的操作是镜像的,因此只考虑一个并重复上面的操作即可,如果n是奇数,那么每次只考虑较大的那个子数列即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
int n;
while(~scanf("%d",&n)) {
int cnt=0;
while(n) {
n>>=1;
cnt++;
}
printf("%d\n",cnt);
}
}