[USACO10FEB] 吃巧克力Chocolate Eating (二分答案)

本文介绍了一种结合二分查找与贪心策略的算法来解决吃巧克力问题的方法。通过直接二分答案并进行贪心判断,确保在限定天数内吃完所有巧克力。特别地,在某天剩余巧克力数量低于目标值时,会吃掉一块巧克力以减少总量。

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

题目链接

Solution

先直接二分答案,然后贪心判断,一旦少于答案就吃一块。
思路很简单,有一点细节。

  • 一天内可以不吃巧克力.
  • 注意处理最后时没吃完的全部在最后一天吃完.

Code

#include<bits/stdc++.h>
#define ll long long
#define N 50008
#define inf 0x3f3f3f3f3f3f3f
using namespace std;

void in(ll &x)
{
    char ch=getchar();ll f=1,w=0;
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
    x=f*w; return;
}

ll n,d,a[N],bl[N];

bool judge(ll st)
{
    ll now=0,res=d;
    for(int i=1;i<=n;i++)
    {
        if(now<st)
            {bl[i]=d-res+1;now+=a[i];}
        else {
            while(1){
                now=now/2;
                if(now<st)break;
                res--;
            }
            res--; now+=a[i]; 
            bl[i]=d-res+1;
        }
    }
    while(1)
    {
        if(now<=st)break;
        res--; now=now/2;
    }
    if(res<1)return 1; 
    if(res==1&&now>=st)return 1;    
    return 0;
}

int main()
{
    in(n),in(d);
    for(int i=1;i<=n;i++) in(a[i]);
    ll l=0,r=inf;
    while(l<=r)
    {
        ll mid=(l+r)/2;
        if(judge(mid))l=mid+1;
        else r=mid-1;
    }
    cout<<l-1<<endl;
    judge(l-1);
    for(int i=1;i<=n;i++)
    {
        if(bl[i]==0||bl[i]>d)bl[i]=d;
        printf("%lld\n",bl[i]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/11209702.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值