链接:https://ac.nowcoder.com/acm/contest/321/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
没有选上课的孩子,或者还有?”“救救孩子……”
__________________________
又又又到了选修课抢课的时间了!集训队成员全心备战亚洲区域赛,居然忘记了选课.
缓过神来的集训队成员现在很想知道,每门课人数从小到大的排序结果是什么.
Wty主席这时微微一笑,早已看穿了一切.
他早就实时爬取了每一个学生所选的课程列表,现在只需要简单的统计就行了!
你能帮帮他们吗?
输入描述:
第一行两个正整数N,M,其中N<=104,M<=104,课程从1-M编号, 接下来N行, 每行一开始为一个非负整数K,表示该学生选课数量,接下来一行内有K个不同的正整数ai表示每个 学生所选的课程编号,其中0<=K<=10 ,1<=ai<=M
输出描述:
M行,每行两个数字,分别代表课程编号与课程人数, 相同人数的,课程编号小的先输出
示例1
输入
3 3 1 1 3 1 2 3 2 2 3
输出
1 2 2 2 3 2
说明
所有课程的人数都一样,于是按照课程编号输出
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int num,sum;
}p[100005];
int a[10005];
bool cmp(node x,node y)
{
if(x.sum!=y.sum)
{
return x.sum<y.sum;
}
else
{
return x.num<y.num;
}
}
int main()
{
int N,M;
int K;
cin>>N>>M;
for(int t=0;t<N;t++)
{
scanf("%d",&K);
for(int j=0;j<K;j++)
{
int s;
scanf("%d",&s);
a[s]++;
}
}
for(int t=1;t<=M;t++)
{
p[t].num=t;
p[t].sum=a[t];
}
sort(p+1,p+M+1,cmp);
for(int t=1;t<=M;t++)
{
cout<<p[t].num<<" "<<p[t].sum<<endl;
}
return 0;
}