第四次训练

网址:CSUST 7月28日(模拟和排序)

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 }
View Code

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 }
View Code

E 见:http://www.cnblogs.com/riddle/p/3224083.html

原文地址:https://www.cnblogs.com/riddle/p/3222340.html