抢课啦!(排序)

链接: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;
}

 

posted @ 2018-12-22 16:10  black_hole6  阅读(183)  评论(0编辑  收藏  举报