c语言 pta 座位安排

pta 座位安排

在某次上机考试时,座位安排规则如下:

先按考生姓名的字典序排列,若姓名相同则再按学号升序排序;在排好序之后依次从1号机位开始安排座位;
若某个机位的电脑损坏了,则原来安排在该位置上的考生从当前最后一位考生之后的机位开始重新安排。
请根据输入的学生信息及电脑损坏的机位,安排好该次考试的学生座位。

输入格式:
首先输入一个正整数T,表示测试数据的组数。对于每组测试数据,首先输入一个整数n(1

输出格式:
对于每组测试,输出n+1行,第1行是“Case i:”,其中i是该组测试的序号(从1开始),接着输出n个座位安排信息“,

输入样例:
2
5
01004 Zhangsan
01002 Lisi
01003 Wangwu
01005 Zhaoliu
01001 Lisi
3 5 1 3
5
1004 Zhangsan
1002 Lisi
1003 Wangwu
1005 Zhaoliu
1001 Lisi
1 5

输出样例:
Case 1:
002:01002 Lisi
004:01004 Zhangsan
006:01001 Lisi
007:01003 Wangwu
008:01005 Zhaoliu

Case 2:
001:1001 Lisi
002:1002 Lisi
003:1003 Wangwu
004:1004 Zhangsan
006:1005 Zhaoliu
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB


#include<stdio.h>
#include<string.h>
typedef struct student {
    char id[11];
    char name[16];
}student;
int main() {
    int T;
    scanf("%d",&T);
    for(int k=1;k<=T;++k){
        int n;
        scanf("%d",&n);
        student p[n];
        for(int i=0;i<n;++i){
            scanf("%s%s",p[i].id,p[i].name);
        }
        
        for(int i=0;i<n;++i){
            for(int j=0;j<n-1-i;++j){
                if(strcmp(p[j].name,p[j+1].name)>0){
                    student temp=p[j];
                    p[j]=p[j+1];
                    p[j+1]=temp;
                }
                else if(strcmp(p[j].name,p[j+1].name)==0&&strcmp(p[j].id,p[j+1].id)>0){
                    student temp=p[j];
                    p[j]=p[j+1];
                    p[j+1]=temp;
                }
            }
        }
        int pos[2*n+1],flag[2*n+1];//flag,0代表没有问题且未被坐的座位,1表示故障的座位,2表示被坐的座位 
        for(int i=0;i<2*n+1;++i){
            flag[i]=pos[i]=0;
        }
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;++i){
            int t;
            scanf("%d",&t);
            flag[t]=1;
        }
        for(int i=1;i<=n;++i){
            pos[i]=i;
            if(flag[i]==0){
                flag[i]=2;
            }
        }
        for(int i=1;i<=n;++i){
            if(flag[i]==1&&pos[i]!=0){
                for(int j=i+1;j<=2*n;++j){
                    if(flag[j]==0){
                        flag[j]=2;
                        pos[i]=0;
                        pos[j]=i;
                        break;
                    }
                }
            }
        }
        printf("Case:%d\n",k);
        for(int i=1;i<=2*n;++i){
            if(pos[i]!=0)
            printf("%03d:%s %s\n",i,p[pos[i]-1].id,p[pos[i]-1].name);
        }
    } 
}

img

结果完全正确