某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入文件count.in包含n+1行;
第一行是整数n,表示自然数的个数;
第2~n+1每行一个自然数。
输出文件count.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
输入样例 8 2 4 2 4 5 100 2 100 输出样例 2 3 4 2 5 1 100 2
#include <iostream> #include <cstdio> #include <stdlib.h> using namespace std; const int M=200005; struct node{ int id; }a[M]; int n,l=0; bool cmp(node a,node b) { return a.id<b.id;} void init(){ long long t,t1; cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&a[i].id); } } void qsort(int l1,int r){//快排 int i,j; i=l1; j=r; node x=a[(l1+r)/2],y; while (i<=j){ while (cmp(a[i],x)) i++; while (cmp(x,a[j])) j--; if (i<=j){ y=a[i]; a[i]=a[j]; a[j]=y; i++; j--; } } if (i<r) qsort(i,r); if (l1<j) qsort(l1,j); } void solve(){ qsort(1,n); int i,j; for(i=1;i<=n;i=j){ j=i+1; printf("%d ",a[i].id); while(a[j].id==a[i].id)j++; printf("%d\n",j-i); } } int main(){ init(); solve(); return 0; }