hdu 6008

http://acm.hdu.edu.cn/showproblem.php?pid=6008

题意:world final的入场券是由一个规则确定的,首先他会分配一个g(总的门票数),g = x+y,x代表给五个中国赛区分配的入场券的个数,y代表给国外的那个赛区分配的个数

在中国赛区的学校是由首先依次轮流选取1->5个赛区的第一名,第二名,第三名,直到x用完,也就是说如果1赛区第二名可以进final的话,那么1-5个赛区的第一名一定都可以进final

当然,每个学校只占用一个名额,那个国外赛区的就是选取前y名,这前y名也不包括已经拿到final门票的学校

思路:模拟

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <string>
 4 #include <iostream>
 5 #include <map>
 6 using namespace std;
 7 
 8 string str[10][100];
 9 string es[100];
10 string ans;
11 int a[1005];
12 map<string,int>s;
13 bool vis[1005];
14 int main()
15 {
16     int t;
17     int g;
18     int x,y;
19     int cnt,cut=1;
20     scanf("%d",&t);
21     while(t--)
22     {
23         memset(vis,false,sizeof(vis));
24         cnt = 0;
25         s.clear();
26         y = -1;
27         cin>>g>>ans;
28         s[ans] = cnt++;
29         for(int i = 1;i<=5;i++)
30             for(int j = 1;j<=20;j++)
31             {
32                 cin>>str[i][j];
33                 if(!s.count(str[i][j]))
34                     s[str[i][j]] = cnt++;
35             }
36         for(int i = 1;i<=20;i++){
37             cin>>es[i];
38             if(!s.count(es[i]))
39                 s[es[i]] = cnt++;
40         }
41         cnt = 0;
42         for(x = 0;x<=g;x++)
43         {
44             memset(vis,false,sizeof(vis));
45             cnt = 0;
46             bool lo = false,cy = false;
47             if(x>0)
48             {
49                 for(int i = 1;i<=20;i++)
50                 {
51                     for(int j = 1;j<=5;j++)
52                     {
53                         if(cnt>=x)
54                             break;
55                         if(!vis[s[str[j][i]]])
56                         {
57                             if(str[j][i]==ans)
58                                 lo = true;
59                             vis[s[str[j][i]]] = true;
60                             cnt++;
61                         }
62                     }
63                     if(cnt>=x)
64                         break;
65                 }
66             }
67             if(g-x>0)
68             {
69                 for(int j = 1;j<=20;j++)
70                 {
71                     if(cnt>=g)
72                         break;
73                     if(!vis[s[es[j]]])
74                     {
75                         if(es[j]==ans)
76                             cy = true;
77                         vis[s[es[j]]] =true;
78                         cnt++;
79                     }
80                 }
81             }
82             if(!lo&&!cy)
83                 y = g-x;
84         }
85         printf("Case #%d: ",cut++);
86         if(y==-1)
87             printf("ADVANCED!
");
88         else
89             printf("%d
",y);
90     }
91     return 0;
92 }
原文地址:https://www.cnblogs.com/Tree-dream/p/7486444.html