Codeforces Round #510 (Div. 2) B. Vitamins
阿新 • • 發佈:2018-12-13
題目描述:(簡化)給出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;
}