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\n"); 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是否满足