Party Lemonade

Party Lemonade

由于L的范围特别大,所以不能直接背包做,然后我们想一想为什么背包问题不能贪心去做,本质上是因为性价比最高的物体会可能导致空间无法充分利用,而这题则不存在这个问题(可以从二进制的角度去想,比如把L写成二进制,那么最高位的1可以由所有商品买若干个获得,且总是需要获得,所以对于这个最高位的1来说他是可以贪心的。),所以我们可以贪心地尽量多地选取性价比高的物品。
然后再贪心选完了之后还要考虑余下的部分:可以再继续选一个当前物品(体积会超出但是价格却是最低的,或者余下的部分继续搜索,需要加个记忆化或者先排个序贪心的去选)。

#include <iostream>
using namespace std;
typedef long long ll;
int n,L;
ll c[33];
int main()
{
    cin>>n>>L;
    for(int i=0;i<n;i++)
    {
        cin>>c[i];
        if(i)c[i]=min(c[i],c[i-1]*2);
    }
    for(int i=n;i<31;i++)
        c[i]=2*c[i-1];
    ll ans=0;
    for(int i=0;i<31;i++)
    {
        if(ans>c[i])ans=c[i];
        if(L&(1<<i))ans+=c[i];
    }
    cout<<ans<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值