77ym 2022-12-23 11:52 采纳率: 66.7%
浏览 440
已结题

c语言 pta 座位安排

pta 座位安排

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

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

输入格式:
首先输入一个正整数T,表示测试数据的组数。对于每组测试数据,首先输入一个整数n(1<n<=80),表示考生数;然后输入n行,每行包含2个以一个空格间隔的字符串,分别表示一个考生的学号(长度不超过10,且仅包含数字字符,可能以0开头)和姓名(长度不超过15,且仅包含英文字母);最后输入一行整数,其中第一个整数m(1<=m<=20)表示损坏电脑的数量,接着是m个电脑损坏的机位(不超过n)。

输出格式:
对于每组测试,输出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

  • 写回答

1条回答 默认 最新

  • 会修bug的猫 2022-12-23 17:13
    关注
    
    #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

    结果完全正确

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月26日
  • 已采纳回答 1月18日
  • 请采纳用户回复 12月25日
  • 创建了问题 12月23日

悬赏问题

  • ¥15 想用@vueuse 把项目动态改成深色主题,localStorge里面的vueuse-color-scheme一开始就给我改成了dark,不知道什么原因(相关搜索:背景颜色)
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥20 白日门传奇少一个启动区服和启动服务器的快捷键,东西都是全的 , 他们说套一个出来就行了 但我就是弄不好,谁看看,
  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题