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 }

猜你喜欢

转载自www.cnblogs.com/tangyimin/p/10567451.html
今日推荐