本題比較容易,直接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;
}