A 大意是m个人在排队,自己在n号,如果第一个是优先级最高的话就出对,time++,否则就排到队伍最后去,问排到自己要多久
1 #include<string.h> 2 #include<iostream> 3 using namespace std; 4 int a[120*120]; 5 int m,n; 6 int sum() 7 { 8 int f=0,max,i,t=0; 9 for(;;) 10 { 11 max=a[f]; 12 for(i=f;i<m;i++) 13 if(a[i]>max) 14 { 15 if(f==n) n=m; //自己排后面去了,编号也要改变 16 a[m++]=a[f++]; 17 break; 18 } 19 else if(i==m-1) //a[f]最大 20 { 21 t++; 22 if(f==n) //自己的编号 23 return t; 24 f++; 25 } 26 } 27 } 28 int main() 29 { 30 int T,i; 31 scanf("%d",&T); 32 while(T--) 33 { 34 scanf("%d%d",&m,&n); 35 for(i=0;i<m;i++) 36 scanf("%d",&a[i]); 37 printf("%d ",sum()); 38 } 39 }
B,就是几对括号,分别翻译成了两种描叙方法,给你其中一种,求另一种。
所给:
(((()()())))
4 5 6666,4是指,在第一个右括号的左边有4个左括号,5是指,在第二个右括号的左边有5个左括号.......一次类推
另一种语言:
1 1 1456 1是指与第一个右括号相配的左括号是他左边的第一个左括号.......4是指与第四个右括号的左括号是他左边的第4个左括号

1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 int main() 6 { 7 int T,a[1000],b[1000],map[1000],c[1000],t,j,n,i; 8 scanf("%d",&T); 9 while(T--) 10 { 11 memset(b,0,sizeof(b)); 12 memset(map,0,sizeof(map)); 13 scanf("%d",&n); 14 for(i=1;i<=n;i++) 15 scanf("%d",&a[i]); 16 b[a[1]+1]=1; //标记右括号为1 17 map[a[1]+1]=1;//标记右括号为1 18 for(i=2;i<=n;i++) 19 { 20 b[a[i]+i]=1;;//标记右括号为1 21 map[a[i]+i]=1;;//标记右括号为1 22 } 23 int q=0; 24 for(i=1;i<=2*n;i++) 25 { 26 if(b[i]==1) 27 { 28 if(b[i-1]==0) 29 { 30 c[++q]=1; //找到相配的左括号 31 b[i-1]=1; //已经被找过,标记为1 32 } 33 else 34 { 35 t=0; 36 for(j=i-2;j>=1;j--) 37 { 38 if(map[j]==0) 39 t++; 40 if(b[j]==0) 41 { 42 c[++q]=i-j-t+1; 43 b[j]=1; 44 break; 45 } 46 } 47 } 48 } 49 } 50 for(i=1;i<=q-1;i++) 51 printf("%d ",c[i]);//输出 52 printf("%d ",c[q]); 53 } 54 return 0; 55 }
C 一个模拟国际象棋棋盘的题
我的思路是先棋盘构造好,在一个个去放棋子,见代码:
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<string> //不加这个头文件会编译错误Orz..... 5 using namespace std; 6 int main() 7 { 8 string a[20]; //字符串组(只有字符串组才能向下面这样初始化。。。。 9 int i,lx,ly,x1,y1,j; 10 char x[120],y[120]; //要用字符串而且要用gets()输入才行,因为在这一串字符里有空格 11 for(i=1;i<=17;i++) //构造棋盘 12 { 13 if((i-1)%2==0) 14 a[i]="+---+---+---+---+---+---+---+---+"; //初始化字符串 15 else if(i%4==0) 16 a[i]="|:::|...|:::|...|:::|...|:::|...|"; 17 else if(i%2==0&&i%4!=0) 18 a[i]="|...|:::|...|:::|...|:::|...|:::|"; 19 } 20 gets(x); //输入白字 21 gets(y);//黑子 22 lx=strlen(x); 23 ly=strlen(y); 24 for(i=7;i<lx;i++) //从下标为7的开始 25 { 26 if(x[i]>='B'&&x[i]<='R') 27 { 28 29 x1=(x[i+1]-96)*4-2; 30 y1=18-(x[i+2]-48)*2; //转化为对应的数字 31 a[y1][x1]=x[i]; 32 i=i+3; 33 34 } 35 else if(x[i]>='a'&&x[i]<='h') 36 { 37 x1=(x[i]-96)*4-2; 38 y1=18-(x[i+1]-48)*2; 39 a[y1][x1]='P'; 40 i=i+2; 41 } 42 else 43 break; 44 } 45 for(i=7;i<ly;i++) 46 { 47 if(y[i]>='B'&&y[i]<='R') 48 { 49 x1=(y[i+1]-96)*4-2; 50 y1=18-(y[i+2]-48)*2; 51 a[y1][x1]=y[i]+32; 52 i=i+3; 53 } 54 else if(y[i]>='a'&&y[i]<='h') 55 { 56 x1=(y[i]-96)*4-2; 57 y1=18-(y[i+1]-48)*2; 58 a[y1][x1]='p'; 59 i=i+2; } 60 else 61 break; 62 } 63 for(i=1;i<=17;i++) 64 cout<<a[i]<<endl; 65 return 0; 66 }
这道题只要是在细节方面很需要注意,一个是string 和char 的选取,另一个是坐标的转化~~~~╮(╯▽╰)╭
D 天坑.....刚开始没看懂题,后来尼玛,只要找出出现得第二多的数......不说了,放代码:

1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 bool cmp(int a,int b) 7 { 8 return a>b; 9 } 10 int main() 11 { 12 int m,n,a[11000],i,b,c[11000],d[11000],t,j,max;//有10000个选手 13 while(~scanf("%d%d",&m,&n)&&m&&n) 14 { 15 max=0; 16 memset(a,0,sizeof(a)); 17 memset(c,0,sizeof(c)); 18 for(i=1;i<=m*n;i++) 19 { 20 scanf("%d",&b); 21 a[b]++; 22 c[b]++; 23 if(b>max) 24 max=b; //找出编号最大的选手 25 } 26 sort(c+1,c+1+max,cmp); 27 for(i=1;i<=101;i++) 28 if(c[i]!=c[1]) 29 { 30 t=c[i]; //找出第二多的次数 31 break; 32 } 33 j=0; 34 for(i=1;i<=max;i++) 35 if(a[i]==t) 36 d[++j]=i; 37 for(i=1;i<j;i++) 38 printf("%d ",d[i]); 39 printf("%d ",d[j]); 40 } 41 return 0; 42 }