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