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瓶柠檬水,给你相对应的每瓶的价格,每瓶的体积分别对应 2i−1 升,给你要买的体积,求出要买的最低价格
分析: 我们可以发现相邻瓶的体积是二倍的关系,可以利用这一点,处理出每个体积对应的最低价格,直接扫一遍即可,然后按位枚举出要买的体积,这里注意,在枚举的过程中,如果当前的价格大于要买体积的价格时,可以直接买当前体积的水,可以这样理解,多买一些,价格更便宜。
参考代码
#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