【CodeForces】913 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; }