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