UVa 11384 Help is needed for Dexter

分析题目以后得出,对于一个连续等差递增的序列,例如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
",r(a));
	}
	return 0;
}


原文地址:https://www.cnblogs.com/SilverNebula/p/5550596.html