第四次训练

网址: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\n",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\n",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\n",d[j]);

40     }

41     return 0;

42 }
View Code

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

你可能感兴趣的:(第四次训练)