码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-19 18:52:57      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:一段   分享   bre   整数   ++   long   格式   family   image   

金环(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;

 

  

 

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

标签:一段   分享   bre   整数   ++   long   格式   family   image   

原文地址:http://www.cnblogs.com/yiyiyizqy/p/7397084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!