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

題意:一個穀倉共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;
}


發佈了50 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章