PTA 天梯赛座位分配问题(c语言结构体实现)

1 篇文章 0 订阅

题目如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值