【Codeforces】913C Party Lemonade (贪...)。

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

    

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/87170534
今日推荐