传送门:Problem B

https://www.cnblogs.com/violet-acmer/p/9682082.html

题意:

  如果可以通过喝果汁将维生素A,B,C全部摄取,求最小花费,如果不能,输出"-1"。

 

题解:

  我的思路:每个果汁含有的维生素最多有7种可能,分别为

  A  B  C

  AB(BA)  AC(CA)  BC(CB)

  ABC(ACB)(BAC)(BCA)(CAB)(CBA)

  将其分别对应为数字1-7

  设变量price[i]

  price[1] : 只含维生素A的饮料的最小价钱

  price[2] : 只含维生素B的饮料的最小价钱

  price[3] : 只含维生素C的饮料的最小价钱

  ...........

  price[7] : 只含维生素ABC的饮料的最小价钱,注意含有维生素ACB和其余四种情况都记录在只含维生素ABC里

  易知price[ ]记录的是含某维生素的最小花费的饮料的假期那

  当n个果汁的信息输入完后,price[ ]数组也初始化完毕。

  接着将含有复合(例如含有维生素AB)维生素的price[ ] 与单个维生素的总价格比较,如果复合的更便宜,则不更新,如果单个的总价格更便宜,则更新复合的价格

  例如price["AB"]=10,price["A"]=2,price["B"]=6;

  显然有price["AB"] > price["A"]+price["B"];

  所以更新price["AB"]=price["A"]+price["B"];

  最后输出price["ABC"]。

  注意不存在三种维生素的情况要输出"-1"。

 

AC代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<map>
 6 using namespace std;
 7 #define INF 0x3f3f3f3f
 8 const int maxn=1010;
 9 
10 int n;
11 int price[8];
12 bool vis[4];
13 
14 map<string,int>mymap;
15 
16 void Copy(string &s,char ss[])
17 {
18     int len=strlen(ss);
19     for(int i=0;i < len;++i)
20         s += ss[i];
21     s += '\0';
22 }
23 void Initial()
24 {
25     mymap.clear();
26     memset(vis,false,sizeof vis);
27     memset(price,INF,sizeof price);
28     mymap["A"]=1;
29     mymap["B"]=2;
30     mymap["C"]=3;
31     mymap["AB"]=mymap["BA"]=4;
32     mymap["AC"]=mymap["CA"]=5;
33     mymap["BC"]=mymap["CB"]=6;
34     mymap["ABC"]=mymap["ACB"]=mymap["BAC"]=mymap["BCA"]=mymap["CAB"]=mymap["CBA"]=7;
35 }
36 void Read()
37 {
38     scanf("%d",&n);
39     for(int i=1;i <= n;++i)
40     {
41         int c;
42         string s;
43         scanf("%d",&c);
44         cin>>s;
45         if(price[mymap[s]] > c)
46             price[mymap[s]]=c;
47     }
48 }
49 void Process()
50 {
51     price[4]=min(price[4],price[1]+price[2]);
52     price[5]=min(price[5],price[1]+price[3]);
53     price[6]=min(price[6],price[2]+price[3]);
54     price[7]=min(price[7],min(min(price[4]+price[3],price[5]+price[2]),price[6]+price[1]));
55     price[7]=min(price[7],min(min(price[4]+price[5],price[4]+price[6]),price[5]+price[6]));
56     printf("%d\n",price[7] >= INF ? -1:price[7]);//通过将所有的price[ ] 值设置为INF来判断ABC是否都存在
57 }
58 int main()
59 {
60     Initial();
61     Read();
62     Process();
63 }
View Code

相关文章: