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

来源:互联网 发布:115 mac版 编辑:程序博客网 时间:2024/06/06 09:43

题意:一个谷仓共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 1000000007using 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;}


0 0
原创粉丝点击