【PAT甲级】1047 Student List for Course (25分)

解题过程的小记录,如有错误欢迎指出。

难度:四星(用输入顺序作为学生序号很巧妙,姓名排序的方法也很神奇)

题目分析

给出学生们的选课情况,要求输出每门课的学生

注意点

  1. 最后一个测试点的数据量很大,用string的话过不了

我的解题过程

思路

  1. 用char name[maxStuNum][5]来存放学生的姓名相当于一个string name[maxStuNum],因为没有重复的名字,所以可以将输入顺序直接赋值给姓名当做序号,用来区分姓名
  2. 用vector<int> course[maxCourseNum]来存放每一门课的学生序号,也就是步骤1里面maxStuNum所表示的数
  3. 按照以上规则输入数据
  4. 写一个cmp比较函数,用于按照字母的升序输出name
  5. 因为是各个course之间的比较,所以只要各个course下的姓名下标重新排序,然后把通过下标找到name进行输出即可

bug

  1. 用了string,最后一个测试点过不了
  2. 输出的时候name的下标写错了,应该要写对应的course下面所对应的姓名序号

代码

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<string.h>

using namespace std;

char name[40005][5];
vector<int> course[2505];

int cmp(int a, int b) {
	return strcmp(name[a], name[b]) < 0 ? 1 : 0;
}

int main()
{
	int n, k;
	cin >> n >> k;
	for (int i = 0; i < n; i++) {
		int coursenum;
		scanf("%s %d", name[i], &coursenum);
		for (int j = 0; j < coursenum; j++) {
			int courseindex;
			scanf("%d", &courseindex);
			course[courseindex].push_back(i);//这里直接把输入顺序作为学生的序号
		}
	}
	for (int i = 1; i <= k; i++) {
		int stunum = course[i].size();
		printf("%d %d\n", i, stunum);
		if (stunum != 0) {
			sort(course[i].begin(), course[i].end(), cmp);
			for (int j = 0; j < stunum; j++) {
				printf("%s\n", name[course[i][j]]);//**这里原来错写成name[j],下标应该是course[i]里面的对应姓名下标
			}
		}
	}
    return 0;
}

dalao的代码

全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~

借鉴点

(本篇我的代码就是参考大佬们写的,这题晴神和柳神思路是一样的,实现方式也差不多,返回来看得话背自己的就好)

  1. 采用自然输入顺序作为姓名的下标的方法
  2. char数组的比较方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值