7-9 座位安排

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

  • 先按考生姓名的字典序排列,若姓名相同则再按学号升序排序;在排好序之后依次从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个座位安排信息“xxx:sno sname”,其中xxx表示以3位整数表示的座位号(不足3位则左补0),sno、sname分别表示该座位上考生的学号和姓名。另外,要求每两组测试之间留一个空行。

输入样例:

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

提示:

对于样例1

初始安排:
1号位:01001 Lisi
2号位:01002 Lisi
3号位:01003 Wangwu
4号位:01004 Zhangsan
5号位:01005 Zhaoliu

损坏的电脑编号:1 3 5

因1号电脑损坏,01001 Lisi排6号位
因3号电脑损坏,01003 Wangwu排7号位
因5号电脑损坏,01005 Zhaoliu排8号位

最终安排:
2号位:01002 Lisi
4号位:01004 Zhangsan
6号位:01001 Lisi
7号位:01003 Wangwu
8号位:01005 Zhaoliu


#include<stdio.h>
#include<string.h>
struct MyStruct
{
	int rank;
	char No[20];
	char name[20];
};
int cmpstr(const void* p1, const void* p2)
{
    if(strcmp(((struct MyStruct*)p1)->name,((struct MyStruct*)p2)->name)==0)
    {
	    return strcmp(((struct MyStruct*)p1)->No,((struct MyStruct*)p2)->No);
            
    }
    else{
       return strcmp(((struct MyStruct*)p1)->name,((struct MyStruct*)p2)->name);
    }

}
int cmprank(const void* p1, const void* p2)
{
	return ((struct MyStruct*)p1)->rank- ((struct MyStruct*)p2)->rank;

}
int main()
{
	int n;
    int count=1;
	scanf("%d", &n);
	while (n--)
	{
		int m;
		scanf("%d", &m);
		int t = m;
		struct MyStruct arr[m];
        printf("Case %d:\n",count++);
		for (int i = 0; i < m; i++)
		{
			scanf("%s%s", arr[i].No, arr[i].name);
			// printf("%s %s\n", arr[i].No, arr[i].name);
		}
		int num;
		scanf("%d", &num);
		int arr_num[num];
		for (int i = 0; i < num; i++)
		{
			scanf("%d", &arr_num[i]);

		}
		qsort(arr, m, sizeof(arr[0]), cmpstr);
		//for (int i = 0; i < m; i++)
		//{
		   // //scanf("%s %s", arr[i].No, arr[i].name);
		   //  //printf("%s %s\n", arr[i].No, arr[i].name);
		//}
		for (int i = 0; i < m; i++)
		{
			int flag = 0;
			int rank = i + 1;
			for (int j = 0; j < num; j++)
			{
				if (rank == arr_num[j])
				{
					flag = 1;
					break;

				}
			}
			if (flag == 0)
			{
				arr[i].rank = rank;
			}
			else 
			{
				arr[i].rank = ++t;
			}

		}
		qsort(arr, m, sizeof(arr[0]), cmprank);
		for (int i = 0; i < m; i++)
		{
			//scanf("%s %s", arr[i].No, arr[i].name);
            if(i==m-1 && n==0)
            {
			    printf("%03d:%s %s", arr[i].rank, arr[i].No, arr[i].name);
                
            }
            else
            {
			    printf("%03d:%s %s\n", arr[i].rank, arr[i].No, arr[i].name);
                
            }
		}
        if(n!=0)
        {
            printf("\n");
            
        }
	}
	
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值