Codeforces 913C - Party Lemonade

时间:2022-08-09 08:32:44

913C - Party Lemonade

思路:对于第i个话费cost[i],取min(cost[i],2*cost[i-1]),从前往后更新,这样就可以保证第n个的话费的性价比最高,那么从最高位开始贪心,取最优解。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a)) const ll INF=0x3f3f3f3f3f3f3f3f;
ll cost[];
int main(){
ios::sync_with_stdio(false);
cin.tie();
int n;
ll l;
cin>>n>>l;
for(int i=;i<n;i++)cin>>cost[i];
for(int i=;i<n;i++)cost[i]=min(cost[i],cost[i-]*);
ll ans=INF;
ll sum=;
for(int i=n-;i>=;i--){
ll need=l/(1ll<<i);
sum+=need*cost[i];
l-=need<<i;
ans=min(ans,sum+(l>)*cost[i]);
//cout<<ans<<endl;
}
cout<<ans<<endl;
return ;
}