题意是给你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; }