题意:n种饮料,每种饮料的体积是2^(n-1),给出每种每瓶的花费,求不小饮料体积不小于L的最小花费
题解:先求出每一种饮料的性价比。如果有饮料可以一瓶满足当前所求值就与ans进行比较选取,再从前面一瓶不够的饮料中选取性价比最高的购买。
#include <bits/stdc++.h>
using namespace std;
const long long INF = (1LL)<<60;
const int maxn = 30 + 10;
long long n, L;
long long c[maxn], p[maxn], idx[maxn];
double C[maxn];
int main()
{
p[0] = 1;
for(int i = 1; i < maxn; i++) p[i] = p[i - 1] * 2;
scanf("%I64d%I64d", &n, &L);
for(int i = 0; i < n; i++){
scanf("%I64d", &c[i]);
C[i] = double(c[i]) / p[i];
idx[i] = i;
}
long long cnt = L, ans = INF, sum = 0;
int k = 0, s = 0;
while(cnt > 0){
for(k = n - 1; k >= 0 && p[k] > cnt; k--) ans = min(ans, sum + c[k]);
double r = INF;
for(int i = 0; i <= k; i++){
if(r >= C[i]){
r = C[i];
s = i;
}
}
sum += (cnt / p[s]) * c[s];
cnt %= p[s];
if(cnt == 0) ans = min(ans, sum);
}
printf("%I64d\n", ans);
return 0;
}