PAT A1047 Student List for Course (25)

PTA跳转:原题链接

这道题大意是:输入学生数量课程数量,输入每个学生选择的多种课程。对于每一个课程,先输出该课程的编号所选的学生数量,然后输出每个学生的姓名

这道题考点是vector(变长数组),难点是有一个测试点会运行超时

第一次把全部cin和cout都改成scanfprintf,在牛客网上显示的运行时间减少了20%左右,但在PTA中提交仍会运行超时。

然后将vector容器从string类型改为int类型,即从存放学生名改为存放学生编号。(其中,学生编号可以直接通过name[40001][5]获得,可大大缩短运行时间)排序中仍是按字符串大小排序,但传参类型变成了整型。修改了这一点,在牛客网上显示的运行时间变为原来的1/3,在PTA中也通过了。

代码如下:

#include <iostream>
#include <vector> 
#include <algorithm>
#include <string.h>
using namespace std;

char name[40001][5];

bool cmp(int a, int b)
{
	return strcmp(name[a], name[b]) < 0;	//递增排序 
}

int main()
{
	int N, K;	//学生数量,课程数量,其余为不断改变的临时变量 
	
	scanf("%d %d", &N, &K);
	vector<int> v[K+1];	//K个vector容器,用于存放选课学生的编号 
	
	for(int i = 0; i < N; i++)	//N个学生 
	{
		int num, course;
		scanf("%s %d", name[i], &num);
		for(int j = 0; j < num; j++)	//每个学生选了num门课 
		{
			scanf("%d", &course);
			v[course].push_back(i);	//课程编号为course的容器添加该学生姓名 
		}
	} 
	
	for(int i = 1; i <= K; i++)	//K个课程 
	{
		printf("%d %d\n", i, v[i].size());	//课程编号和选该课程的学生数量
		sort(v[i].begin(), v[i].end(), cmp);
		for(int j = 0; j < v[i].size(); j++)
		{
			printf("%s\n", name[v[i][j]]);	//选该课的学生
		}
	}
	return 0;
}

氷鸢鸢鸢
2020.4.19

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值