• 天梯---天梯赛座位分配(模拟)


    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

    输入格式:

    输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

    输出格式:

    从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。

    输入样例:

    3
    3 4 2

    输出样例:

    #1
    1 4 7 10 13 16 19 22 25 28
    31 34 37 40 43 46 49 52 55 58
    61 63 65 67 69 71 73 75 77 79
    #2
    2 5 8 11 14 17 20 23 26 29
    32 35 38 41 44 47 50 53 56 59
    62 64 66 68 70 72 74 76 78 80
    82 84 86 88 90 92 94 96 98 100
    #3
    3 6 9 12 15 18 21 24 27 30
    33 36 39 42 45 48 51 54 57 60

    让位置排成一排,为每一个座位分配学校号。

    num[i]表示各个学校的队伍数,vis[i]表示第i个座位上做的是哪个学校的学生。

    对于某个位置,判断他跟前面的位置是不是一个学校,若果不是,填入学校号码,否则该位置跳过,进行下一个

    设置flag标志,如果遍历一遍各个学校,没有一个学校被安排位置,就说明安排完毕,可退出。

    注意:输出时候注意行末不留空格

     1 #include <bits/stdc++.h>
     2 const int INF=0x3f3f3f3f;
     3 typedef long long LL;
     4 const double eps =1e-8;
     5 const int mod=1e9+7;
     6 const int maxn=1e5+10;
     7 using namespace std;
     8 
     9 int num[105];
    10 int vis[maxn];
    11 vector<int> vt[105];
    12 
    13 int main()
    14 {
    15     #ifdef DEBUG
    16     freopen("sample.txt","r",stdin);
    17     #endif
    18     
    19     int n,m;
    20     scanf("%d",&n);
    21     for(int i=1;i<=n;i++)
    22         scanf("%d",&num[i]);
    23     int pos=1;
    24     while(1)
    25     {
    26         int flag=1;//判断是否可以跳出循环 
    27         for(int i=1;i<=n;i++)
    28         {
    29             if(vt[i].size()>=num[i]*10) continue;//该学校不用再分配座位了 
    30             if(vis[pos-1]!=i)
    31             {
    32                 vis[pos]=i; vt[i].push_back(pos);
    33                 flag=0; pos++;
    34             }
    35             else
    36             {
    37                 vis[pos+1]=i; vt[i].push_back(pos+1);
    38                 flag=0; pos+=2;
    39             }
    40         }
    41         if(flag) break;
    42     }
    43     for(int i=1;i<=n;i++)
    44     {
    45         printf("#%d
    ",i);
    46         for(int j=0;j<vt[i].size();j++)
    47             printf((j+1)%10==0?"%d
    ":"%d ",vt[i][j]);
    48     }
    49     
    50     return 0;
    51 }

    结构体写法:

     1 #include <bits/stdc++.h>
     2 const int INF=0x3f3f3f3f;
     3 typedef long long LL;
     4 const double eps =1e-8;
     5 const int mod=1e9+7;
     6 const int maxn=1e5+10;
     7 using namespace std;
     8 
     9 struct node
    10 {
    11     int a[1010];
    12     int cnt;
    13     int flag;
    14     int n;
    15 }P[105];
    16 
    17 int main()
    18 {
    19     #ifdef DEBUG
    20     freopen("sample.txt","r",stdin);
    21     #endif
    22     
    23     int n,m;
    24     scanf("%d",&n);
    25     m=n;
    26     for(int i=1;i<=n;i++)
    27     {
    28         scanf("%d",&P[i].cnt);
    29         P[i].flag=0;
    30         P[i].n=0;
    31     }
    32     int num=0;
    33     if(m==1) num--;
    34     while(m)
    35     {
    36         for(int i=1;i<=n;i++)
    37         {
    38             if(P[i].n>=P[i].cnt*10)
    39             {
    40                 if(P[i].flag==0)
    41                 {
    42                     P[i].flag=1;
    43                     m--;
    44                 }
    45             }
    46             else
    47             {
    48                 if(m>1)
    49                 {
    50                     P[i].a[++P[i].n]=++num;
    51                 }
    52                 else
    53                 {
    54                     num+=2;
    55                     P[i].a[++P[i].n]=num;
    56                 }
    57             }
    58         }
    59     }
    60     for(int i=1;i<=n;i++)
    61     {
    62         printf("#%d
    ",i);
    63         for(int j=1;j<=P[i].cnt*10;j++)
    64         {
    65             printf(j%10==0?"%d
    ":"%d ",P[i].a[j]);
    66         } 
    67     }
    68     
    69     return 0;
    70 }

    -

  • 相关阅读:
    cloudera cdh4 hue 安装
    设计模式Observer(观察者模式)
    编译android源码三(编译系统)
    centos 6.3 修改默认的系统语言
    Linux下查看文件和文件夹大小的df和du命令
    编译android源码二(下载源代码)
    devenv.exe
    Javascript和xml合用
    DataKeys的用法
    XSL(转)
  • 原文地址:https://www.cnblogs.com/jiamian/p/12535509.html
Copyright © 2020-2023  润新知