codeforces 913 C. Party Lemonade【思维贪心】

C. Party Lemonade

time limit per test1 second
memory limit per test256 megabytes

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 liters and costs ci roubles. The number of bottles of each type in the store can be considered infinite.

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 ≤ 109) — 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 ≤ 109) — 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

output

150

input

4 3
10000 1000 100 10

output

10

input

4 3
10 100 1000 10000

output

30

input

5 787787787
123456789 234567890 345678901 456789012 987654321

output

44981600785557577

Note

In the first example you should buy one 8-liter bottle for 90 roubles and two 2-liter bottles for 30 roubles each. In total you’ll get 12 liters of lemonade for just 150 roubles.

In the second example, even though you need only 3 liters, it’s cheaper to buy a single 8-liter bottle for 10 roubles.

In the third example it’s best to buy three 1-liter bottles for 10 roubles each, getting three liters for 30 roubles.

题意:给你n瓶柠檬水,给你相对应的每瓶的价格,每瓶的体积分别对应 2i1 升,给你要买的体积,求出要买的最低价格

分析: 我们可以发现相邻瓶的体积是二倍的关系,可以利用这一点,处理出每个体积对应的最低价格,直接扫一遍即可,然后按位枚举出要买的体积,这里注意,在枚举的过程中,如果当前的价格大于要买体积的价格时,可以直接买当前体积的水,可以这样理解,多买一些,价格更便宜。

参考代码

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll a[123456];

int main(){
    int n;
    ll sum;cin>>n>>sum;
    for(int i = 0;i < n;i++) {
        cin>>a[i];
    }

    for(int i = 1;i < n;i++) {
        a[i] = min(a[i],a[i-1] * 2);
    }

    for(int i = n-2;i >= 0;i--) {
        a[i] = min(a[i],a[i+1]);
    }

    for(int i = n;i < 31;i++) {
        a[i] = a[i-1] << 1;
    }

    ll res = 0;
    for(int i = 0;i < 31;i++) {
        if(res > a[i]) res = a[i];
        if(sum & (1 << i) ) res += a[i];
    }

    cout<<res<<endl;

    return 0;
}
  • 如有错误或遗漏,请私聊下UP,thx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值