46 萌新寒假作业八 E题 数位

CF 913C

判断条件是关键!!!!!!

要求:商店里有从1到n共n种容积不同但种类相同的饮料,第i种饮料容积为2^(i-1)升,
价格为ci,1≤n≤30,1≤i≤n,1≤ci≤10^9。问至少购买L升饮料最低需要多少钱。
方法:数位。
因为每种饮料的容积与二进制的第i位数一致,故可用数位方法求解。
1.因若用两个小的组成一个大的可能是大的价格更小,用i从1到31遍历,求出ci的最小值,
需注意当ci原本为0时,直接令ci=2*c(i-1)。
2.将L变为二进制并存于数组num中。
3.用i从31到0遍历num数组,用min2[cnt]记录所有可能的最小值。
若num[i]等于1,用now记录从高位到低位价格的值,now+=c[i]。
              若min2[cnt]为0,将之前统计的now加上,再加本位的价格,
               min2[cnt]+=(now+c[i])。
              若max1[cnt]不为0,已将之前统计的now加上,直接加本位的价格,
               min2[cnt]+=c[i]。        
               因容积未满L升,故循环继续。    
若num[i]等于0,若max1[cnt]为0,将之前统计的now加上,再加本位的价格,
               min2[cnt]+=(now+c[i])。
              若max1[cnt]不为0,已将之前统计的now加上,直接加本位的价格,
               min2[cnt]+=c[i]。 
               根据二进制的特点,从高位到低位遍历时将0变为1,此时购买的饮料
               升数已大于L,遍历结束,cnt++,进行下一个最小值统计。
4.再计算升数等于L的价格,存入min2数组中。 
5.求出min2数组的最小值并输出。          

猜你喜欢

转载自blog.csdn.net/irving0323/article/details/81217881