cogs 76. [NOIP2007] 统计数字
【问题描述】
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
【输入格式】
输入文件pcount.in包含n+1行
第1行是整数n,表示自然数的个数。
第2--n+1行每行一个自然数。
【输出格式】
输出文件pcount.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其问用一个空格隔开。
【输入输出样例】
输入:
8
2
4
2
4
5
100
2
100
输出:
2 3
4 2
5 1
100 2
【限制】
40%的数据满足:1<=n<=1000
80%的数据满足:1<=n<=50000
100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*10^9)
这个题我犯了一个超级超级超级zz的错误!!!
mmp,
我觉得肯定特别高级,,
我刚开始的思路是这样的,
用一个bool数组记录是否出现过,,
用两个数组一个记录数字,一个记录出现次数,,,
然后排序输出,
我还考虑去重函数了呢,,
mmp,
全都超出空间限制了!!!
代码是长这样的:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 long long n,x,t; 9 bool b[150000002]; 10 int a[150000002],c[200002]; 11 12 int main() 13 { 14 freopen("pcount.in","r",stdin); 15 freopen("pcount.out","w",stdout); 16 scanf("%d",&n); 17 for(int i=1;i<=n;++i) 18 { 19 scanf("%lld",&x); 20 if(b[x]==0) 21 { 22 b[x]=1; 23 t++; 24 c[t]=x; 25 } 26 a[x]++; 27 } 28 sort(c+1,c+t+1); 29 for(int i=1;i<=t;++i) 30 printf("%d %d\n",c[i],a[c[i]]); 31 return 0; 32 }
然后!!!
突然发现这个题特别的简单!!!
用快排,
拍完之后直接相邻的相等就记录,
不相等就输出不就完了。。。
mmp。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 int n,s=1; 9 int a[200002]; 10 11 int main() 12 { 13 freopen("pcount.in","r",stdin); 14 freopen("pcount.out","w",stdout); 15 scanf("%d",&n); 16 for(int i=1;i<=n;++i) 17 scanf("%d",&a[i]); 18 sort(a+1,a+n+1); 19 for(int i=1;i<=n;++i) 20 { 21 if(a[i]==a[i+1]) s++; 22 else 23 { 24 printf("%d %d\n",a[i],s); 25 s=1; 26 } 27 } 28 return 0; 29 }
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。