1. 程式人生 > >Codeforces Round #510 (Div. 2) B. Vitamins

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; }