题目
链接:https://ac.nowcoder.com/acm/contest/321/B
没有选上课的孩子,或者还有?”“救救孩子……”
又又又到了选修课抢课的时间了!集训队成员全心备战亚洲区域赛,居然忘记了选课.
缓过神来的集训队成员现在很想知道,每门课人数从小到大的排序结果是什么.
Wty主席这时微微一笑,早已看穿了一切.
他早就实时爬取了每一个学生所选的课程列表,现在只需要简单的统计就行了!
你能帮帮他们吗?
输入描述:
第一行两个正整数N,M,其中N<=10^4, M<=10^4,课程从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
题意:有n个同学m个课程,每个人选k个课程,然后输出课程的编号与此课程选的人数。
解题:无力吐槽此出题人,没有说明输出的顺序,只是说课程人选的数量相同时,先输出编号小的课程编号,其他就没有说明了,出题人真是废!!最后才知道输出的顺序是按照课程被选的数量从小到大输出,相同的时候,先输出编号小的!!!
AC–Code
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class QiangKe {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] a = new int[m+1];
for(int i =0;i<n;i++)
{
int a1 = sc.nextInt();
for(int j =0;j<a1;j++)
{
int b = sc.nextInt();
a[b]++;
}
}
ArrayList<E> list = new ArrayList<E>();
for(int i=1;i<m+1;i++)
{
E e = new E(i, a[i]);
list.add(e);
}
Collections.sort(list);
for (E e : list) {
System.out.println(e.bh+" "+e.s);
}
sc.close();
}
}
class E implements Comparable<E>{
int bh;
int s;
public E(int bh,int s) {
this.bh = bh;
this.s = s;
}
public int compareTo(E o) {
if(this.s<o.s)
{
return -1;
}
else if(this.s==o.s)
{
if(this.bh>o.bh)
return 1;
return -1;
}
return 1;
}
}