标签:一段 分享 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;
标签:一段 分享 bre 整数 ++ long 格式 family image
原文地址:http://www.cnblogs.com/yiyiyizqy/p/7397084.html