Codeforces-Hello 2018C. Party Lemonade(贪心)

传送门

N个数,代表得到2^(i-1)次幂的花费,求构造L的最小花费

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define INF 0x3f3f3f3f
 6 using namespace std;
 7 typedef long long LL;
 8 
 9 LL val[40];
10 bool vis[40];
11 int N;
12 LL L;
13 
14 int main() {
15     scanf("%d%lld", &N, &L);
16     val[0] = 1000000000;
17     LL tmp;
18     for (int i = 1; i <= N; i++) {
19         scanf("%lld", &tmp);
20         val[i]= min(tmp, 2 * val[i - 1]);
21     }
22     for (int i = N + 1; i <= 31; i++) {
23         val[i] = 2 * val[i - 1];
24     }
25     int high = 0;
26     LL ans = 0;
27     for (int i = 30; i >= 0; i--) {//power
28         LL tmp = 1LL << i;
29         if (L >= tmp) {
30             L -= tmp;
31             vis[i] = 1;
32         }
33     }
34     for (int i = 0; i <= 30; i++) {
35         ans = min(ans, val[i + 1]);
36         if (vis[i]) {
37             ans += val[i + 1];
38         }
39     }
40     printf("%lld
", ans);
41     return 0;
42 }
原文地址:https://www.cnblogs.com/xFANx/p/8448408.html