题意:一个谷仓有n个谷物,每天晚上运进来m个谷物,从第一天时每天早上都有相当于天数的鸟吃相当于天数的谷物(第i天就有i只,吃掉i个谷物)。问第几天谷仓会空。
分析:
1:首先如果直接暴力模拟肯定超时。
2:如果m>=n的话那必定是n天发现
3:因为鸟是一个递增数列而且d=1,当第m天后谷物就会减少
所以可以列出方程 m+(ans+1)*(ans)/2>=n;(因为最后一天可能等不到填充谷物,谷仓就空了,所以加m)。
那么解出来的ans+m就是答案。
因为是一个2次方程,所以直接二分答案就可以啦
AC代码
include<stdio.h>
#include<math.h>
int main()
{
long long n,m;
scanf("%lld%lld",&n,&m);
long long l=0,r=5e9,ans;
if(n<=m)
printf("%lld\n",n);
else
{
while (l<r)
{
long long mid=(l+r)>>1;
long long sum=(mid+1)*mid/2;
if (sum+m>=n)
{
ans=mid;
r=mid;
}
else
{
l=mid+1;
}
}
printf("%lld\n",m+ans);
}
}