题目如下:
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。
分析结果:有n个学校,每个学校可能有任意个队伍(数量不大于10)队伍,每个队伍固定有10个队员。如果剩下一个学校多余了n个队伍,那么队伍里面的每个人都要隔一个座位来进行就座。
代码如下:
//c(gcc)
#include<stdio.h>
#include<stdlib.h>
struct school{
int team[15][15];
int num;
};
int cmp(const void *p, const void *q){
return *(int*)q-*(int*)p;
}
int main(){
int n;
int b[200];
int i,j,k;
struct school a[200];
int count = 0;
scanf("%d",&n);
for(i=0; i<n; ++i){
scanf("%d",&a[i].num);
b[i] = a[i].num;
}
if(n == 1){
count = 1;
printf("#1\n");
for(i=0; i<a[0].num; ++i){
for(j=0; j<10; ++j){
printf("%d",count);
count += 2;
if(j<9) printf(" ");
}
puts("");
}
}
else{
int max = 0;
qsort(b,n,sizeof(int),cmp);
for(i=0; i<n; ++i){
if(a[max].num < a[i].num)
max = i;
}
//用来判断是否只有一个学校队伍数目最多
int flag = 1;
for(i=0; i<n; ++i){
if(a[max].num == a[i].num && max != i){
flag = 0;
break;
}
}
//座位号获取
for(i=0; i<a[max].num; ++i){
for(j=0; j<10; ++j){
for(k=0; k<n; ++k){
//判断该学校队伍数目是否足够来存放内容
if(a[k].num >= i+1){
int temp; //temp用于存放上一次是哪一个学校获得的座位号,用来判断是否加1还是加2
if(flag && i>=a[max].num-(b[0]-b[1])){
if(temp != max && j==0){
a[k].team[i][j] = ++count;
temp = k;
}else{
a[k].team[i][j] = (count += 2);
temp = k;
}
}
else{
a[k].team[i][j] = ++count;
temp = k;
}
}
}
}
}
//输出
for(i=0; i<n; ++i){
printf("#%d\n",i+1);
for(j=0; j<a[i].num; ++j){
for(k=0; k<10; ++k){
printf("%d",a[i].team[j][k]);
if(k<9) printf(" ");
}
puts("");
}
}
}
return 0;
}