1028: 可乐(2018年中南大学研究生复试机试题 )

1028: 可乐

时间限制: 1 Sec  内存限制: 128 MB
提交: 307  解决: 59
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
猪年快乐!在这个快乐的日子里我们当然要去超市买可乐喝啦!
现在超市有n种可乐,第 i 种可乐的价格为C[i] ,体积为 2i-1 毫升,每种可乐都是无限供应的 ,现在你想买至少 L毫升的可乐 ,作为一个省钱小能手,聪明的你能够想到最少要花多少钱吗?
输入
输入包含多组测试用例。
每组测试用例第一行包含两个数字 n 和 L (1 ≤ n ≤ 30; 1 ≤ L ≤ 109) , n是可乐的种类数, L是我们最终要买的可乐体积。
第二行包含 n 个数字 C1,C2,...Cn n (1 ≤ ci ≤ 109) ,代表每一种可乐的价格。
输出
输出一个数字 , 购买至少L毫升的可乐需要的最少花费。
样例输入
4 12
20 30 70 90
4 3
10000 1000 100 10
4 3
10 100 1000 10000
样例输出
150
10
30
来源/分类
 
 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 /*用贪心的思想做,尽量用单价最小的买,这里需要留意的地方是,有可能用单价最低
 7 的买会出现这种情况,就是不能凑整,但是用单价低的多买一瓶有可能会比用单价高的
 8 其他体积的凑整便宜,所以每次都需要进行比较,和多买一瓶进行比较*/
 9 
10 struct cole{
11     int v;
12     int price;
13     double per;
14 }arr[35];
15 
16 bool cmp1(cole a, cole b) {
17     return a.per < b.per;
18 }
19 
20 int main(){
21     int n;
22     long long L;
23     while (cin >> n >> L){
24         for (int i = 0; i<n; i++){
25             cin >> arr[i].price;
26             arr[i].v = pow(2, i);
27             arr[i].per = (double)arr[i].price / arr[i].v;
28         }
29         sort(arr, arr + n, cmp1); 
30         int j = 0;
31         long long sum = 0, min=0;
32         while (L>0){
33             int vol = arr[j].v;
34             int cost = arr[j].price;
35             sum = sum + (L / vol)*cost;
36             if (j == 0){//最开始的时候就用单价最低的价格买完,多买一瓶,保证买完
37                 min = (L / vol)*cost +cost;
38             }
39             if (L%vol == 0){//恰好可以用最优的分量买完
40                 if (sum < min)min = sum;
41                 break;
42             }
43             if (sum + cost < min){//进行比较
44                 min = sum + cost;
45             }
46             L = L%vol;
47             j++;
48         }
49         cout << min << endl;
50     }
51     return 0;
52 }

 

转载于:https://www.cnblogs.com/tangyimin/p/10567451.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值