hdu 6008 Worried School

题意:给出G,和一个学校名称X,然后给出6组比赛,前面5个是区域赛学校排名,最后是final排名,我们可以选择让区域赛出线X个名额,finl出线Y个名额,X+Y=G,如果无论X和Y的值,X学校都能出线,输出“ADVAN

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 map<string ,int > a;
 5 
 6 string b[7][22];
 7 int c[7][22];
 8 set<int >se;
 9 
10 
11 int main(){
12     int t;
13     int k=1;
14     cin>>t;
15     while(t--){
16         int n;
17         string s;
18         a.clear();se.clear();
19         scanf("%d",&n);
20         cin>>s;
21         int l=0;
22         for(int i=1;i<=6;i++){
23             for(int j=1;j<=20;j++){
24                 cin>>b[i][j];
25                 if(a[b[i][j]])
26                     c[i][j]=a[b[i][j]];
27                 else {
28                     a[b[i][j]]=++l;
29                     c[i][j]=a[b[i][j]];
30                 }
31             }
32         }
33         int x=a[s];
34         int tt=0;
35         for(int i=1;i<=20;i++){
36             for(int j=1;j<=5;j++){
37                 if(c[j][i]==x) {
38                    // cout<<j<<" "<<i<<" "<<se.size()<<endl;
39                     tt=1;break;
40                 }
41                 se.insert(c[j][i]);
42                 if(se.size()>=n) {
43                     tt=2;break;
44                 }
45             }
46             if(tt) break;
47         }
48         printf("Case #%d: ",k++);
49         if(tt==2){
50             printf("0
");
51         }
52         else if(tt==1){
53             int y=n-se.size();
54             for(int i=1;i<=20;i++){
55                 if(c[6][i]==x) break;
56                 se.insert(c[6][i]);
57             }
58             if(se.size()>=n) cout<<y<<endl;
59             else cout<<"ADVANCED!"<<endl;
60         }
61     }
62 }

CED!”,否则输出最小的Y,区域赛出线规矩,每个赛区的第一。。。再每个赛区的第二。。。(一个学校一个名额)

思路:模拟,我们可以求出最大的X,看Y是否满足

原文地址:https://www.cnblogs.com/hhxj/p/7525962.html