版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/87170534
http://codeforces.com/contest/913/problem/C
这个题和以前见过的有点不一样,可以重复选择,这个有点emmm
首先将a数组优化,举个例子,如果1L20元,2L50元,那么将a[1]赋值为40,而不是50。
之后就是进行选择,从体积多的开始选择。
num 表示 全部选择V升的饮料,尽可能地满足need,需要的V升饮料的数量,可能小于need,可能等于need。
ans 表示在上一个状态的基础上进行比较(...)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
typedef long long ll;
int a[35];
ll ans = 9223372036854775807;
int main ()
{
int i,n,need;
cin >> n >> need;
cin >> a[0];
for(i=1;i<n;i++)
{
cin >> a[i];
a[i] = min(a[i],2*a[i-1]);
}
/*
for(i=0;i<n;i++)
{
cout << a[i] << " ";
}
cout << "\n---------------------\n";
*/
ll V,num,sum=0;
for(i=n-1;i>=0;i--)
{
V = pow(2,i);
num = need/V;
//cout << "V = " << V << endl;
//cout << "num = " << num << endl;
need -= num*V;
//cout << "need = " << need << endl;
//cout << "sum = " << sum << endl;
//cout << "ans = " << ans << endl;
ans = min(sum+(num+1)*a[i],ans);
sum += num*a[i];
//cout << "sum = " << sum << endl;
//cout << "ans = " << ans << endl;
//cout << "---------------------\n";
}
sum = min(ans,sum);
cout << sum << endl;
return 0;
}
Input
4 12
20 30 70 90
Output
150
Input
4 3
10 100 1000 10000
Output
30