UVa11384正整数序列(递归,二分)

2014-11-24 03:07:05 · 作者: · 浏览: 1
题目大意: 有一个从1、2、3、.......n的正整数数列,现在要通过若干次操作将这个数列全部变为0,操作的方法是每次选取任意1个或多个任意位置的数,然后将这几个数同时减去一个一个数。问至少要经过多少次操作才能让数列全部变为0
思路:在纸上试几个数就可以发现,比如6时,456同时减去4这个中间数,剩下123012其实只取决于123这部分f(6) = f(3) + 1。 所以有:f(n) = f(n/2) + 1,边界是f(1) = 1。
#include 
  
   
using namespace std;

int f(int n)
{
	return n == 1   1 : f(n/2) + 1;
}

int main()
{
	int n;
	while(cin>>n)
	{
		cout<
   
    
还可以直接用二分的方法
#include 
     
      
using namespace std;

int main()
{
	int n;
	while(cin>>n)
	{
		int ans = 0;
		while(n)
		{
			n>>=1;
			ans ++;
		}
		cout<