题解-金币(小学组2019第四题)

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

题目要求

背景

山东省小学组(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;
}

但是这样的话显而易见:超时!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值