链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1239
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
【输入】
第一行是整数n,表示自然数的个数;
第2~n+1每行一个自然数。
【输出】
包含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)。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int a[200005],t[200005]; void msort(int l,int r) { if(l==r)return ; int mid=(l+r)/2; msort(l,mid); msort(mid+1,r); int i=l,j=mid+1,m=l; while(i<=mid&&j<=r) { if(a[i]>a[j])t[m++]=a[j++]; else t[m++]=a[i++]; } while(i<=mid)t[m++]=a[i++]; while(j<=r)t[m++]=a[j++]; for(int i=l;i<=r;i++)a[i]=t[i]; } int main() { int n,flag=1; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; msort(1,n); int k=a[1],cnt=0; for(int i=1;i<=n;i++) { if(a[i]==k)cnt++; else { cout<<k<<" "<<cnt<<endl; k=a[i]; cnt=1; } } cout<<a[n]<<" "<<cnt<<endl; return 0; }