本题比较容易,直接ac了
最后一个测试点用时780ms
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
vector<string> course[2501];
bool cmp(string a,string b){
return a<b;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,k,c;
char name[5];
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%s %d",name,&c);
string str=name;
for(int j=0;j<c;j++){
int temp;
scanf("%d",&temp);
course[temp].push_back(str); //往课程中添加选该课程的学生
}
}
for(int i=1;i<=k;i++){
int lenC=course[i].size();
printf("%d %d\n",i,lenC);
sort(course[i].begin(),course[i].end(),cmp);
for(int j=0;j<lenC;j++){
printf("%s\n",course[i][j].c_str());
}
}
return 0;
}
用字符数组代替字符串(虽然vector不能放字符数组类型,但可以借助在外面定义字符数组类型,通过整型来充当两者的中介,间接实现):
最后一个测试点用时262ms
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
vector<int> course[2501];
char stu[40001][5];
bool cmp(int a,int b){ //根据字符数组大小比较来间接排序vector里的整数
return strcmp(stu[a],stu[b])<0;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,k,c;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){ //每个学生对应stu数组中不同的下标,只要将下标记录在course数组中,相当于记录了学生名字
scanf("%s %d",stu[i],&c);
for(int j=0;j<c;j++){
int temp;
scanf("%d",&temp);
course[temp].push_back(i);
}
}
for(int i=1;i<=k;i++){
printf("%d %d\n",i,course[i].size());
sort(course[i].begin(),course[i].end(),cmp);
for(int j=0;j<course[i].size();j++){
printf("%s\n",stu[course[i][j]]);
}
}
return 0;
}