C. Anton and Fairy Tale(codeforces)

C. Anton and Fairy Tale

问题:一个粮仓,早上存粮,晚上被麻雀偷吃。第一天存入n,n是粮仓的容量,之后每天存入m,如果某天存入的量和剩余的量大于n,那么只能留下n。第一天有一只麻雀偷吃,第二天又两只麻雀偷吃,以此类推。问:到第几天粮仓第一次为空。


若n <= m;
每天都会把粮仓填满(n),直到第n天,粮仓里的粮食会被n只麻雀第一次吃空。
若n > m;
直到第m天,粮仓一直是满的–(n),但从m+1天开始,粮仓的粮食每天都会减1,因为你n和m都可能会很大,所以直接爆搜一定会Tle,我们就可以用二分搜索(我们可以统计从m+1天开始,每天减少的总量【等差数列求和】,直到某天总量大于n,到这天粮仓一定就空了)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    
    
	ll n, x, ans;
	scanf("%lld%lld", &n, &x);
	
	if(n <= x) {
    
    
		printf("%lld", n);	
		return 0;
	}
	ll l = 1, r = INT_MAX, mid;
	//二分
	while(l < r) {
    
    
		mid = (l + r)/2;
		if((mid+1)*mid/2 >= (n-x)) r = mid;
		else l = mid+1;
	}
	printf("%lld", l+x);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45363113/article/details/106734958