数据结构实验之排序七:选课名单
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
随着学校规模的扩大,学生人数急剧增加,选课名单的输出也成为一个繁重的任务,我校目前有在校生3万多名,两千多门课程,请根据给定的学生选课清单输出每门课的选课学生名单。
Input
输入第一行给出两个正整数N( N ≤ 35000)和M(M ≤ 2000),其中N是全校学生总数,M是课程总数,随后给出N行,每行包括学生姓名拼音+学号后两位(字符串总长度小于10)、数字S代表该学生选课的总数,随后是S个课程编号,约定课程编号从1到M,数据之间以空格分隔。
Output
按课程编号递增的顺序输出课程编号、选课总人数以及选课学生名单,对选修同一门课程的学生按姓名的字典序输出学生名单。数据之间以空格分隔,行末不得有多余空格。
Example Input
5 3 Jack01 2 2 3 Jone01 2 1 3 Anni02 1 1 Harry01 2 1 3 TBH27 1 1
Example Output
1 4 Anni02 Harry01 Jone01 TBH27 2 1 Jack01 3 3 Harry01 Jack01 Jone01
Hint
Author
xam
= =:还有这种操作系列。。。
= =:还有这种操作系列。。。
#include <bits/stdc++.h>
using namespace std;
bool cmp(string a, string b)
{
return a < b;
}
int main()
{
int n,m;
int i,j;
vector<string>x[2010];//这个不定长数组用的相当巧妙。。。在以每个课程为下标的x[i]中存不知道个数的名字
int M[2010];
while(cin>>n>>m)
{
memset(M, 0, sizeof(M));//数组M存序号为t的课被选了几次
string temp;
while(n--)
{
cin>>temp;
int tn;
cin>>tn;
while(tn--)
{
int t;
cin>>t;
x[t].push_back(temp);
M[t]++;
}
}
for(i=1; i<2010; i++)
{
if(M[i]!=0)
{
sort(x[i].begin(), x[i].end(), cmp);
cout<<i<<" "<<M[i]<<endl;
for(j=0; j<M[i]; j++)
{
cout<<x[i][j]<<endl;
}
}
}
}
return 0;
}
/***************************************************
User name:
Result: Accepted
Take time: 324ms
Take Memory: 7064KB
Submit time: 2017-07-23 15:33:01
****************************************************/