天天看點

Codeforces 913 C. Party Lemonade (思維)

Description

A New Year party is not a New Year party without lemonade! As usual, you are expecting a lot of guests, and buying lemonade has already become a pleasant necessity.

Your favorite store sells lemonade in bottles of n different volumes at different costs. A single bottle of type i has volume 2i − 1

You want to buy at least L liters of lemonade. How many roubles do you have to spend?

Input

The first line contains two integers n and L (1 ≤ n ≤ 30; 1 ≤ L ≤ 10^9) — the number of types of bottles in the store and the required amount of lemonade in liters, respectively.

The second line contains n integers c1, c2, …, cn (1 ≤ ci ≤ 10^9) — the costs of bottles of different types.

Output

Output a single integer — the smallest number of roubles you have to pay in order to buy at least L liters of lemonade.

Examples input

4 12
20 30 70 90      

Examples output

150      

題意

有 n 種物品,其大小分别為 2i−1 ,花費分别為 ci ,物品的個數無限,現要組成大小至少為 L

思路

因為 2n−1×2=2n

于是從小到大掃一遍計算出組成目前大小為 2i 所需要的最小花費,記為 ai

然後針對大小 L

用 now 記錄已通路的高位中所需要的花費,若目前位為 1 , now+=a[i] ,因為我們不能通過這一位組合出大小大于 L

若目前位為 0 ,記錄 now+a[i] ,因為此時我們隻需要将該位填充為 1 即可組出大于 L

AC 代碼

#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(false);\
    cin.tie(0);\
    cout.tie(0);
using namespace std;
const int maxn = 1e5+10;
const int mod = 1e9+7;
typedef long long LL;

LL n,l,a[maxn];
bitset<32> sk;
set<LL> ans;
int main()
{
    IO;
    cin>>n>>l;
    for(int i=0; i<n; i++)
        cin>>a[i];
    LL now = a[0];
    for(int i=1; i<32; i++)
    {
        now <<= 1;
        a[i] = i<n?min(a[i],now):now;
        now = a[i];
    }
    sk = l;
    now = 0;
    for(int i=31; i>=0; i--)
        if(sk[i])
            now +=a[i];
        else
            ans.insert(now+a[i]);
    ans.insert(now);
    cout<<*ans.begin()<<endl;
    return 0;
}