今天是毕业的学长给高二的同学测试。组队比赛,ACM赛制,于是就愉快的和学姐一队啦。
看到英文题面感到恐慌,不过好在不难读懂。
A:并没有什么技术含量的模拟题;
B:字符串题,给定一些比赛和每个队胜利的场数,判断是否合法。
[[a-b]-[c-d]],a 2,b 0,c,1,d 0就是合法的。(意思是:a和b比一场,c和d比一场,两场的胜者再一起比一场)
递归地读入形成一个树的结构,从最基础的比赛层层check上去。
1 # include <cstdio> 2 # include <iostream> 3 # include <cstring> 4 # include <string> 5 6 using namespace std; 7 8 int l,a,b,v[30],x,cnt=26,ap=0; 9 bool vis[30],f=true; 10 char p,s[1000]; 11 struct race 12 { 13 int x,y,w; 14 }r[1000]; 15 16 int read (int x) 17 { 18 int pos=x+1,a,b; 19 if(s[pos]=='[') 20 { 21 pos=read(pos); 22 a=cnt; 23 }else 24 a=s[pos]-'a'; 25 pos+=2; 26 if(s[pos]=='[') 27 { 28 pos=read(pos); 29 b=cnt; 30 }else 31 b=s[pos]-'a'; 32 r[++cnt].x=a; 33 r[cnt].y=b; 34 return pos+1; 35 } 36 37 int main() 38 { 39 scanf("%s",s+1); 40 read(1); 41 l=strlen(s+1); 42 for (int i=1;i<=l;++i) 43 if(s[i]>='a'&&s[i]<='z'&&vis[ s[i]-'a' ]==false) 44 vis[ s[i]-'a' ]=true,ap++; 45 for (int i=1;i<=ap;++i) 46 { 47 cin>>p>>x; 48 v[p-'a']=x; 49 } 50 for (int i=27;i<=cnt;++i) 51 { 52 race now=r[i]; 53 if(now.x<26) 54 a=now.x; 55 else 56 a=r[now.x].w; 57 if(now.y<26) 58 b=now.y; 59 else 60 b=r[now.y].w; 61 if(v[a]==0&&v[b]!=0) 62 { 63 r[i].w=b; 64 v[b]--; 65 } 66 else if(v[a]!=0&&v[b]==0) 67 { 68 r[i].w=a; 69 v[a]--; 70 } 71 else f=false; 72 } 73 for (int i=0;i<26;++i) 74 if(v[i]) f=false; 75 if(f) printf("Yes\n"); 76 else printf("No\n"); 77 return 0; 78 }