标签:学生 tchar 函数 char cout 处理 bool 爬取 getc
题目描述
没有选上课的孩子,或者还有?”“救救孩子……”
又又又到了选修课抢课的时间了!集训队成员全心备战亚洲区域赛,居然忘记了选课.
缓过神来的集训队成员现在很想知道,每门课人数从小到大的排序结果是什么.
Wty主席这时微微一笑,早已看穿了一切.
他早就实时爬取了每一个学生所选的课程列表,现在只需要简单的统计就行了!
你能帮帮他们吗?
第一行两个正整数N,M,其中N<=1e4,M<=1e4,课程从1-M编号,
接下来N行,
每行一开始为一个非负整数K,表示该学生选课数量,接下来一行内有K个不同的正整数ai表示每个学生所选的课程编号,
其中0<=K<=10 ,1<=ai<=M
M行,每行两个数字,分别代表课程编号与课程人数,
相同人数的,课程编号小的先输出
3 3 1 1 3 1 2 3 2 2 3
1 2 2 2 3 2
所有课程的人数都一样,于是按照课程编号输出
#include<bits/stdc++.h> using namespace std; int n,m; inline int Rd() { int x=0; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) ch=getchar(); while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x; } //这我不知道为什么大家read都要用这个函数
//好我现在知道了,这就是传说中的快读。。比scanf和cin都快。。我还不怎么理解,我先记住
struct Course{ int date,cho; }a[10001]; //结构体用来储存编号和课程人数 inline bool cmp(Course A,Course B) { return A.cho==B.cho?A.date<B.date:A.cho<B.cho; } //这个cmp函数简直神了,我大概解释一下,就是如果AB人数相等就编号小的排前面,如果不相等就人数少的排前面 int main() { register int i,j,k; int tmp; n=Rd(),m=Rd(); for(i=1;i<=m;++i) a[i].date=i; for(i=1;i<=n;++i) { k=Rd();
for(j=1;j<=k;++j) tmp=Rd(),++a[tmp].cho;
} sort(a+1,a+1+m,cmp); //sort函数从a[1]开始,所以用a+1 for(i=1;i<=m;++i) printf("%d %d\n",a[i].date,a[i].cho); return 0; }
注一下:上面register int 中register 表示使用cpu内部寄存器(中央处理器内的组成部分)的变量,而平时的int是把变量放在内存中,存到寄存器中可以加快变量的读写速度
数据较大的时候(比如1e8)就可以用register,原则上跟>> 按位与 按位或这种好像差不多…
尼玛。。这代码 我自己试了一下 很多神坑啊
比如我第一次试的时候。。死活通不过 发现cmp函数的()里面变量用错了。。有结构体的时候必须用结构体struct A,struct B,我一开始用了int i,int j,然后就废了
第二次,我复制了原来代码稍微改了一下,发现cin cout 好像不行啊???
for(j=1;j<=k;++j) tmp=Rd(),++a[tmp].cho;
但是这一段代码。。就这一段代码,我一开始真的没发现,居然是逗号!!逗号!!
而且我换成分号就提示tmp没初始化,而且答案也是错的 一改回逗号就对了???
标签:学生 tchar 函数 char cout 处理 bool 爬取 getc
原文地址:https://www.cnblogs.com/Lyrixblogs/p/10226384.html