CodeForces - 991C Candies(二分)

探讨了Vasya和Petya如何分配n颗糖果的问题,通过二分查找算法确定Vasya每日至少需消耗多少糖果,以确保他能吃掉一半以上的糖果。文章提供了完整的C++实现代码,展示了算法细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题干:

给定糖果数n。
Vasya每天早上起来吃i颗糖果,Petya每天晚上吃现有糖果数的十分之一(向下取整)(如果现有糖果数小于10则不吃)。
求Vasya 每天至少要吃多少糖果,才能在糖果被全部吃完时至少吃了一半的糖果。
1<=n<=1018{10}^{18}1018

思路:

虽然给定的n有1e18,但因为不是多组输入,所以还是可以用二分(o(lg(n)))来暴力的。
因为打表没找出啥规律
注意下n=1的情况和二分的边界

#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll n;
bool chick(ll x)
{
	ll t=n,sum=0;
	while(t)
	{
		if(t>x)
		{
			t-=x;
			sum+=x;
		}
		else 
		{
			sum+=t;
			t=0;
		}
		if(t>=10)
			t-=(t/10);
	}
	//printf("%lld\n",sum);
	if(sum>=(n+1)/2)
		return true;
	else 	
		return false; 
}
int main()
{
	scanf("%lld",&n);
	if(n==1)
		printf("1\n");
	else
	{
		ll l=1,r=n,mid,ans=n;
		while(l<=r)
		{
			mid=(l+r)/2;
			//printf("%lld %lld\n%lld\n",l,r,mid);
			if(chick(mid))
			{
				r=mid-1;
				ans=min(ans,mid);
			}
			else	
				l=mid+1;
		}
		printf("%lld\n",ans);
	}
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值