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

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 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 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12535509.html