1039.Course List for Student

来源:互联网 发布:动态模拟软件 编辑:程序博客网 时间:2024/05/29 12:46
【题意】
        给出每个课程的选修学生以及要查询自己课程的学生名字,返回每个学生相应选修了的课程号

【思路】
        用vector存下每个学生选的课程,排个序即可

【注意点】
        这道题卡时间,一开始我用的是map<string,vector<int>>存每个学生的课程号,但最后一个case会超时。后来看了网上别人的解题报告才发现题目中一个重要信息:学生的名字前三位是大写英文字母,第4位是数字,也就是说最多有26*26*26*10个学生,每个学生的名字都可以用一个数字表示,这样一来就可以不用map了,直接用一个vector<int>数组即可。这样找一个学生的vector的时间就是O(1)了。

        造成超时的另一个原因是对string的操作相对char*而言更为费时,把名字用char*而非string表示就ok了。


#include <iostream>#include <vector>#include <algorithm>#include <cstdio>using namespace std;#define MAXSIZE 26*26*26*10int name2index(char *name){return (name[0]-'A')*26*26*10+(name[1]-'A')*26*10+(name[2]-'A')*10+name[3]-'0';}int main(int argc, char const *argv[]){vector<int> students[MAXSIZE];char name[5];int n,k,index,num,studentId;cin >> n >> k;while(k--){cin >> index >> num;while(num--){scanf("%s", name);studentId = name2index(name);students[studentId].push_back(index);}}while(n--){scanf("%s", name);cout << name << " ";studentId = name2index(name);cout << students[studentId].size();sort(students[studentId].begin(), students[studentId].end());for(vector<int>::iterator it=students[studentId].begin(); it!=students[studentId].end(); it++){cout << " " << *it;}if(n){cout << endl;}}system("pause");return 0;}


0 0
原创粉丝点击