Codeforces Round #510 (Div. 2) B. Vitamins

题目描述:(简化)给出n种果汁,每种果汁可能包含A,B,C三种维生素,
每种果汁都有加个,问想要包含三种种维生素的最小花费。
题目链接:http://codeforces.com/contest/1042/problem/B
思路:因为只要包含三种维生素即可,所以可以暴力,具体见代码。
c++代码:

#include <iostream>
#include <vector>
#include <set>
#include <cstring>

using namespace std;

const int INF=1e9;

int v[9];

int main() {
	int n;
	cin >> n;
	for(int i=1;i<8;i++)v[i]=INF;
	for(int i=0;i<n;i++) {
		int t;
		string s;
		cin >> t >> s;
		int cnt=0;//将维生素配置转化为二进制表示
		for(int j=0;j<s.length();j++) {
			if(s[j]=='A')cnt=cnt|(1<<0);
		    else if(s[j]=='B')cnt=cnt|(1<<1);
		      else if(s[j]=='C')cnt=cnt|(1<<2);
		}
		//cout << cnt << endl;
		v[cnt]=min(v[cnt],t);
		//cout <<"v "<<v[cnt] << endl; 	
	}
	int ans=INF;
	bool flag=0;
	for(int i=1;i<8;i++) {
		if(v[i]<INF) {
			int tmp=v[i];
			if(i==7){
				ans=min(ans,tmp);
				flag=1;
				continue;
			}
			for(int j=1;j<8;j++) {
				if(v[j]>=INF)continue;
				int x=i;
				x|=j;
				tmp+=v[j];
				if(x==7) {
					ans=min(ans,tmp);
					tmp-=v[j];
					flag=1;
					continue;
				}
				for(int k=1;k<8;k++) {
					if(v[k]>=INF)continue;
					int y=x;
					y|=k;
					tmp+=v[k];
					if(y==7) {
						ans=min(ans,tmp);
						tmp-=v[k];
						flag=1;
						continue;
					}
					tmp-=v[k];
				}
				tmp-=v[j];
			}
		}
	}
	if(flag)
	cout << ans << endl;
	else cout << -1 << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/82919302
今日推荐