【CodeForces】913 C. Party Lemonade

【题目】C. Party Lemonade

【题意】给定n个物品,第i个物品重量为2^(i-1)价值为ci,每个物品可以无限取,求取总重量>=L的最小代价。1<=30<=n,1<=L,ci<=10^9。

【算法】数学(二进制原理)

【题解】实际上每个物品的重量对应答案的一个二进制位,先对物品进行预处理:

1.将没用的大物品用小物品替代(价值不如前面的小物品叠加)。

2.用单价最小的物品补齐后面的二进制位。

然后把L二进制展开,从小到大扫描:如果该位是1则必须选择该物品,如果该位是0则当该物品代价<前面总代价时,用这一个物品替换前面的所有物品。

#include<cstdio>
#define ll long long
int n,L;
ll c[100];
int main(){
    scanf("%d%d",&n,&L);
    for(int i=0;i<n;i++)scanf("%lld",&c[i]);
    ll mxc=1ll<<60,mxnum=1;
    for(int i=0;i<n;i++){
        if(c[i]*mxnum>mxc*(1<<i))c[i]=1ll*mxc*((1<<i)/mxnum);
        else mxc=c[i],mxnum=1<<i;
    }
    for(int i=n;i<=30;i++)c[i]=1ll*mxc*((1<<i)/mxnum);
    ll ans=0;
    for(int i=0;i<=30;i++){
        if(L&(1<<i))ans+=c[i];else if(ans>c[i])ans=c[i];
    }
    printf("%lld",ans);
    return 0;
}
View Code

 

posted @ 2018-01-09 11:18  ONION_CYC  阅读(363)  评论(0编辑  收藏  举报