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 }