题意是给你n种柠檬水,每种柠檬水有2^(i - 1)次方的体积和c[i]的价格,现在他需要L升,问你最少需要花费多少钱可以买到L升的柠檬水。
思路:由于第i瓶的体积为2^(i-1)价格为c[i],如果我们可以用两瓶第i-1瓶柠檬水体积2^(i-1)所用的价格比它少,我们就用两瓶i-1的柠檬水(以此类推)....
然后从后往前..
如果当前体积大于第i瓶柠檬水的体积,又由于第i瓶的价格是前1 - i所有凑出来的最小值,所以第i瓶的柠檬水必选。如果(当前体积)/(当前柠檬水的体积)不为0时,你可以继续选择多一瓶当前柠檬水或者继续向前凑柠檬水体积
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
typedef long long ll;
ll c[maxn];
int main() {
ll n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> c[i];
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
int t1 = (1 << (i - 1));
int t2 = (1 << (j - 1));
c[j] = min(c[j], t2 / t1 * c[i]);
}
}
ll ans = 5e18;
long long res = 0;
for (int i = n; i >= 1; i--) {
ll t1 = (1 << (i - 1));
res += m / t1 * c[i]; // 必须选择当前柠檬水体积
m = m % t1; //是否有体积溢出
ans = min(ans, res + (m > 0) * c[i]); // 尝试一下多选择一瓶当前柠檬水
}
cout << ans << endl;
return 0;
} 
京公网安备 11010502036488号