金环(2017佛山市选拔初中组)

金环(2017佛山市选拔初中组)

题目描述

小月亮到达了一个城市并住在一个宾馆。她没有钱了,但是过了N天,她就会收到一大笔钱。但是她有一条由N个金环串成的金链。小月亮必须每天付1个金环给商家,但是她可以一次付多个金环同时收到多个金环作为找的钱,前提是这些找回的金环必须是她在此之前付给商家的。当她收到那一大笔钱时,她就会把她的金链赎回来。小月亮喜欢她的金链,所以想尽可能少地切断金环来支付给商家。(原来金链的每个金环是环环相扣形成一个链,而不是环)请帮帮她。举个例子,当N=5的时候,她必须切断第2个金环,使得项链变为1,1,3,三个部分。第一天,她给商家一个金环。第二天,她也给了商家一个金环。此时她手里有一段由3个金环构成的金链,在第三天给商家这段金链后,商家把前面小月亮给的2个金环作为找的零钱。第4,5天她就会每天付给商家1个金环。假设小月亮可以选择商家找零的方式。

输入格式 1754.in

一个数字N(1 <= N <= 10^16)。

输出格式 1754.out

一个整数(最少需要切断几个金环)

输入样例 1754.in

9

输出样例 1754.out

2
【提示】
可以断开第二个和第六个金环

 

 

  这题的代码量虽然很少,但是要想出来比较困难,是周老师教我们的。

  设X为断开的珠子数量。

  因此,我们其实可以事先确定断的金环个数(设为x),那么后面每段的长度分别为x+1,2x+2,4x+4……将这些段的长度都加起来

当我们把它断出一个时,剩下的就会有2份;断出两个时,就会剩下3份;断出三个时,就会剩下4份。

 

  批注:O为珠子,由/断开。

    所以段的数量为X+1。

主代码

 

for(int i=1; ;i++)
	{
		long long sum=0,k=2;
		for(int j=1;j<=i+1;j++)
		{
			if(j==1) sum+=i;
			else
			{
				sum+=i*k+k;
				k=k*2;
			}
		}
		if(n<=sum) 
		{
			ans=i;
			break;
		}
	}
	cout<<ans<<endl;

 

  

 

posted @ 2017-08-19 16:38  yiyiyizqy  阅读(397)  评论(0编辑  收藏  举报