题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#overview
比赛.........还是英语没学好啊........有些题目看不懂.............= =
A.Printer Queue
//单独讲.............
B.Parencodings
很简单.......
我是开了三个数组a[n],b[n],c[n]-------------a[n]代表输入的n个数,b[n]代表是输出的n个数,c[n]代表n个左括号的状态(配对了还是没有配对);
b[0]=1;
若a[i]-a[i-1]>0,那么i右括号所对应左括号就在它左边第一位,记b[i]=1,c[a[i]-1]=1(标记这个被配对的左括号);
若a[i]-a[i-1]=0,那么从c[a[i]-1]开始向c[0]搜索,第一个没有被标记的右括号j就是配对的括号,即b[i]=a[i]-j,c[j]=1(标记配对括号);
代码如下:
1 #include<iostream> 2 #include<string.h> 3 #include<stdio.h> 4 using namespace std; 5 6 int main() 7 { 8 int n,x; 9 int a[1000],b[1000],c[1000]; 10 scanf("%d",&n); 11 while(n--) 12 { 13 scanf("%d",&x); 14 int i,j,k; 15 for(i=0;i<x;i++) 16 scanf("%d",&a[i]); 17 memset(c,0,sizeof(c)); 18 c[a[0]-1]=1; 19 for(i=1;i<x;i++) 20 if((a[i]-a[i-1])!=0) c[a[i]-1]=1; 21 b[0]=1; 22 for(i=1;i<x;i++) 23 { 24 k=a[i]-a[i-1]; 25 if(k!=0) b[i]=1; 26 else 27 { 28 for(j=a[i]-1;j>=0;j--) 29 if(c[j]==0){ b[i]=a[i]-j; c[j]=1;break;} 30 } 31 } 32 for(i=0;i<x-1;i++) 33 printf("%d ",b[i]); 34 printf("%d\n",b[x-1]); 35 } 36 return 0; 37 }
C.Emag eht htiw Em Pleh
先打出棋盘,再把点放到对应的位置,最后打印出棋盘。题目不难,就是要细心............WA了好几次,就是坐标点应该减‘0’时,写成了‘1’...........T T
代码:
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<cstdio> 5 using namespace std; 6 7 int main() 8 { 9 char a[63],b[63]; 10 string c[17]; 11 int i,j,k,xa,xb; 12 for(i=0;i<17;i+=2) 13 c[i]="+---+---+---+---+---+---+---+---+"; 14 for(i=1;i<17;i+=4) 15 c[i]="|...|:::|...|:::|...|:::|...|:::|"; 16 for(i=3;i<17;i+=4) 17 c[i]="|:::|...|:::|...|:::|...|:::|...|"; 18 gets(a); 19 gets(b); 20 xa=strlen(a); 21 xb=strlen(b); 22 k=7; 23 for(i=7;i<xa;i++) 24 { 25 if(a[i]==',') 26 { 27 if(i-k==3) 28 { 29 c[(8-(a[i-1]-'0'))*2+1][2+(a[i-2]-'a')*4]=a[k]; 30 k=i+1; 31 } 32 else 33 { 34 c[1+(8-(a[i-1]-'0'))*2][2+(a[i-2]-'a')*4]='P'; 35 k=i+1; 36 } 37 } 38 } 39 c[1+(8-(a[k+1]-'0'))*2][2+(a[k]-'a')*4]='P'; 40 k=7; 41 for(i=7;i<xb;i++) 42 { 43 if(b[i]==',') 44 { 45 if(i-k==3) 46 { 47 c[1+(8-(b[i-1]-'0'))*2][2+(b[i-2]-'a')*4]=b[k]+32; 48 k=i+1; 49 } 50 else 51 { 52 c[1+(8-(b[i-1]-'0'))*2][2+(b[i-2]-'a')*4]='p'; 53 k=i+1; 54 } 55 } 56 } 57 c[1+(8-(b[k+1]-'0'))*2][2+(b[k]-'a')*4]='p'; 58 for(i=0;i<17;i++) 59 cout<<c[i]<<endl; 60 return 0; 61 }
D.Grandpa is Famous
题目不难,我的解法是,用一个数组记录每个数字输入了多少次,再找出输入第二多的数字,再输出。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int main() 7 { 8 int a[10010],b[250000],i,j,x,y,n,max1,max2; 9 while(scanf("%d%d",&x,&y)!=EOF) 10 { 11 if(x==0 && y==0) break; 12 memset(a,0,sizeof(a)); 13 for(i=0;i<x*y;i++) 14 { 15 scanf("%d",&b[i]); 16 a[b[i]]++; 17 } 18 max1=-1; 19 max2=-1; 20 for(i=0;i<10010;i++) 21 { 22 if(a[i]>max1) 23 { 24 max2=max1; 25 max1=a[i]; 26 } 27 else 28 if(a[i]>max2) 29 max2=a[i]; 30 } 31 for(i=0,n=0;i<10010;i++) 32 if(a[i]==max2) 33 { 34 if(n==0) 35 printf("%d ",i); 36 else 37 printf(" %d",i); 38 } 39 printf("\n"); 40 } 41 return 0; 42 }
E.An Old Stone Game
单独讲............