分析题目以后得出,对于一个连续等差递增的序列,例如1,2,3,4,5,6,每次选择其中后一半,减去能减的最大数,则是最优操作。
上述序列经过一次操作后变为1,2,3,0,1,2,此时可抛弃后一半(已经能和前一半一起处理了),操作前三个数的后两个,以此类推,总共三次操作可把所有数减成0
分析得到递推式:设n为序列长度,ans(n)=ans(n/2)+1
于是代码变得很简单了:
#include<bits/stdc++.h>
using namespace std;
int a;
int r(int num){
return num==1? 1:r(num/2)+1;
}
int main(){
while(scanf("%d",&a)!=EOF){
printf("%d\n",r(a));
}
return 0;
}