1.题目描述:
谷仓大小是n每天会增加m粒新收成的谷子,有鸟第一天来一只,第二天来两只,第n天来n只,并且它们每只最多吃1粒谷子,问你谷仓第一次为空的时间。
3.解题思路:
很容易想到二分时间。关键在如何判断上面。这里我是这样考虑,第m+1天之前,鸟对谷堆是不会产生影响的,因为吃的谷子数少于m的话,每次增加m相当于没吃,那么对于m+1天开始,相当于第m + i天对谷堆影响就是i,就是x[i] = (a[i] - m)。这样就是单调函数了,我们再去二分答案,然后答案再加上m(至少需要m天才能对谷堆产生影响)。
4.AC代码:
#include <bits/stdc++.h>
#define INF 0x7fffffff
#define maxn 100100
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long long ull;
ll n, m;
bool check(ll x)
{
ll num = (1 + x) * x / 2;
return num >= n - m;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
while (~scanf("%lld%lld", &n, &m))
{
if (n <= m)
{
printf("%lld\n", n);
continue;
}
ll l = 1, r = INF, mid, ans = 0;
while (l <= r)
{
mid = l + r >> 1;
if (check(mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
printf("%lld\n", ans + m);
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}
close