PAT甲级-1039 Course List for Student(结合1047一起看)

本题与甲级1047很像,可以一起看,并且灵活检验了STL。是一道好题。
本题注意点:
1.这道题考察每个学生选的课程。是由字符串映射到数字。所以自然而然想到map <string, vector< int> >,但此题用这个最后一个测试往往数值很大会导致超时。所以采用字符串hash求解。
2.如果用二维数组存储学生的课程编号,会导致最后一组测试用例内存超限,所以用vector二维节省空间(每个课选的人不用开辟最大的空间)。

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
int hashgetID(char s[])
{
	int id=0;
	for(int i=0;i<3;i++)
	{
		id=id*26+(s[i]-'A');
	}
	id=id*10+s[3]-'0';
	return id;
} 

int main()
{
	int n,k,course_id,num;//n是学生个数 
	vector<int> course[26*26*26*10+1];
	char name[5];
    scanf("%d%d",&n,&k);
	for(int i=0;i<k;i++)
	{
		scanf("%d%d",&course_id,&num);
		for(int j=0;j<num;j++)
		{
			scanf("%s",&name);
			int id=hashgetID(name);
			course[id].push_back(course_id);
		}
	}
	for(int i=0;i<n;i++)
	{
		scanf("%s",&name);
		//printf("%s",name);
		int id=hashgetID(name);
        sort(course[id].begin(),course[id].end());
        printf("%s",name);
		printf(" %d",course[id].size());
		
		for(int j=0;j<course[id].size();j++)
		{
			printf(" %d",course[id][j]);
		}
		printf("\n");
	}
	return 0;
}

总结:
1.刚开始忘记了空格,全部通过不了。
2.然后最后一个测试点通过不了,发现是hash函数写错了。
理解一下hash函数。类似于十进制数1234,110+2=12,1210+3=123,123*10+4=1234.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值