• 第四次训练


    网址: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

  • 相关阅读:
    C/C++程序内存的分配
    【解题报告】UVA101 The Blocks Problem
    洗牌算法
    【持续更新】算法竞赛常用模板
    北京邮电大学2021乐理公共选修课期末考试
    Oracle通用大数据量存储过程分页修正版
    (转)NHibernate 3.0在PetShop 3层架构中的应用
    Json.Net学习笔记
    JS获得浏览器高度和宽度参数
    jQuery数组处理汇总
  • 原文地址:https://www.cnblogs.com/riddle/p/3222340.html
Copyright © 2020-2023  润新知