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