您的位置:首页 > 其它

【CodeForces】913 C. Party Lemonade

2018-01-09 11:18 337 查看

【题目】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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: