1028
贪心
#include<bits/stdc++.h>
using namespace std;
struct cole{
int price;
int v;
double pre;
}arr[35];
bool cmp(cole a,cole b){
return a.pre < b.pre;
}
int pow1(int x){
int sum = 1;
if(x == 0) return sum;
for(int i = 1; i <= x; i++) sum = sum<<1;
return sum;
}
int main(){
long long n,bag;
while(scanf("%lld%lld",&n,&bag)!=EOF){
for(int i = 1; i<=n; i++) {
scanf("%d",&arr[i].price);
arr[i].v = pow1(i-1);
arr[i].pre = (double)arr[i].price/arr[i].v;
}
sort(arr + 1,arr + n + 1,cmp);
long long sum = 0,min = 0;
int j = 1;
while(bag > 0){
int v = arr[j].v;
int p = arr[j].price;
sum += bag/v * p;
if(j == 1){//最开始就用单价最小的买,多买一瓶
min = sum + p;
}
if(bag % v == 0){//恰好可以用最优的解分完
if(sum < min) min = sum;break;
}
if(sum + p < min){//进行比较
min = sum + p;
}
bag %= v;
j++;
}
cout << min << endl;
}
return 0;
}