题目要求
背景
山东省小学组(CSP-X)2019第四题。
题目描述
乔治在梦中来到了一个神奇部落,这个部落的神树具有奇特的功能:对于每一位新朋友,都会获赠金币,而且金币的数量会随时间的延续而增加:
第 1 周,每天 1 枚金币;
第 2 周,每天 2 枚金币;
第 3 周,每天 3 枚金币;……
请问:至少多少天,乔治的金币数量达到 n 枚?
输入格式
一行,只有一个正整数 n。
输出格式
一行,一个整数,表示金币达到 n 枚所需的最少天数。
样例输入
30
样例输出
17
提示/说明
【样例说明】
第 1 周:每天 1 枚,共 7 枚;
第 2 周:每天 2 枚,共 14 枚;
第 3 周:每天 3 枚,3 天即可:7+14+3*3=30。
共计:7+7+3 = 17 天。
【数据规模】
对于 30%的数据, n 不超过 2147483647;
对于 100%的数据, n 的位数不超过 18。
解题步骤
这道题属于中等难度,考验代码能力。首先分析一下问题,告诉我们每周可以得多少个金币,求需要多少天。
首先想到的就是for循环,不断用i去试余数,用变量ans累加天数,直到余数为零或不够为止。这很简单,代码如下:
#include<bits/stdc++.h>
#define int long long //捣乱一下很好玩
using namespace std;
main(){
int n,ans=0;
scanf("%lld",&n);
for(int i=1;;i++){
if(n-7*i>0) n-=7*i,ans+=7; //以一个星期7天为单位,可以优化时间复杂度
else if(n-7*i<=0){ //如果不够直接退出
ans+=n/i;
break;
}
}
printf("%lld",ans);
return 0;
}
但是这样的话显而易见:超时!

探讨了如何通过二分搜索解决一个关于金币累积的问题,该问题源自山东省小学组2019年的竞赛题目。文章详细介绍了从原始的暴力解法到采用数学规律和二分搜索进行优化的过程。
&spm=1001.2101.3001.5002&articleId=128821200&d=1&t=3&u=f4a8ded7a9b642ba94b96e4507a3eb82)
1174

被折叠的 条评论
为什么被折叠?



