codeforces round#404(div.2) C. Anton and Fairy Tale

本文介绍了一道关于谷仓存米的问题,通过数学分析和二分查找算法解决何时鸟儿能吃完谷仓里的米。特别讨论了不同情况下米被吃完的具体日期,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:一个谷仓共n粒米(最多存放n粒),每天会先送来m粒米,然后会有鸟来吃,第i天会来i只鸟,一只鸟吃一粒米,输出第几天谷仓的米可以被鸟吃完。


首先我们先特判一下,当n<=m时,只能到第n天才能吃完(刚开始就是这个地方没考虑被hack了难过

然后考虑n>m的情况,前m天肯定是吃不完,从第m+1天开始,每天多来一只鸟,也就是第i天(i>m)会一共吃掉

(m+1+2+...+i)粒米,即(1+i)*i/2+m粒米只需找出最小的i使得该值>=n,即满足(i+1)*i>=2*(n-m),然后我们只需用二分把这个i找出来即可(也可以用求根公式),最后输出(i+m)。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<bitset>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<utility>
#define INF 0x3f3f3f3f
#define inf 2*0x3f3f3f3f
#define llinf 1000000000000000000
#define pi acos(-1)
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
ll n,m,lb=-1,ub=inf;
int main()
{
    cin>>n>>m;
    if(m>n)
    {
        cout<<n;
        return 0;
    }
    while(ub-lb>1)
    {
        ll mid=(ub+lb)/2;
        if(mid*(mid+1)>=2*(n-m))ub=mid;
        else lb=mid;
    }
    cout<<ub+m<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值