PAT甲级题解-1047. Student List for Course (25)-排序
一开始是建立了course[2501][40001]数组,存储每节课的学生编号
然后for循环两层输出,但这样复杂度为O(2500*40000),也很明显导致最后时间超时
后来发现最多40000学生,每个学生最多选20门课,那么总共也就40000*20
所以直接就存储学生-课程的信息,然后排个序,按照课程从小到大,课程一样的话则按字典序
然后从头扫一遍即可,复杂度O(80000)
不过要注意一点,有些课可能并没有出现,所以要做个判断,输出x 0。
#include <iostream> #include <string> #include <string.h> #include <algorithm> #include <map> #include <cstdio> using namespace std; const int maxn=40000+1; char id_name[maxn][20]; struct Stu{ char name[20]; int course; bool operator<(const Stu tmp)const{ if(course==tmp.course){ if(strcmp(name,tmp.name)<=0) return true; else return false; } else return course<tmp.course; } }stu[maxn*20]; int main() { int n,k; scanf("%d %d",&n,&k); int idx=0; int c; char name[20]; int num[2505]; memset(num,0,sizeof(num)); for(int i=0;i<n;i++){ //cin>>stu[i].name; scanf("%s",name); scanf("%d",&c); for(int j=0;j<c;j++){ scanf("%d",&stu[idx].course); strcpy(stu[idx].name,name); num[stu[idx].course]++; idx++; } //sort(stu[i].course,stu[i].course+stu[i].c); } sort(stu,stu+idx); int last=0,now=0; for(int i=0;i<idx;i++){ if(i==0){ now=stu[i].course; for(int j=1;j<now;j++) printf("%d 0\n",j); //没有出现的课,也要输出0 printf("%d %d\n",stu[i].course,num[stu[i].course]); printf("%s\n",stu[i].name); last=stu[i].course; } else{ if(stu[i].course!=stu[i-1].course){ now=stu[i].course; for(int j=last+1;j<now;j++) printf("%d 0\n",j); //没有出现的课,也要输出0 printf("%d %d\n",stu[i].course,num[stu[i].course]); printf("%s\n",stu[i].name); last=stu[i].course; } else{ printf("%s\n",stu[i].name); } } } return 0; }