天梯---天梯赛座位分配(模拟)
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 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 开始。
输入样例:
输出样例:
#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\n",i); 46 for(int j=0;j<vt[i].size();j++) 47 printf((j+1)%10==0?"%d\n":"%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\n",i); 63 for(int j=1;j<=P[i].cnt*10;j++) 64 { 65 printf(j%10==0?"%d\n":"%d ",P[i].a[j]); 66 } 67 } 68 69 return 0; 70 }
-