【9207&&b701】统计数字(NOIP2007)

来源:互联网 发布:淘宝投诉盗图不成立 编辑:程序博客网 时间:2024/06/06 01:53

问题描述
某次科研调查时得到了n个自然数,每个数均不超过1500000000 (1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

Input

输入文件count.in包含n+1行; 第一行是整数n,表示自然数的个数; 第2~n+1每行一个自然数。

Output

输出文件count.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。 【限制】
40%的数据满足:1<=n<=1000
80%的数据满足:1<=n<=50000
100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*109)

Sample Input

1291400000000389564589768974563228815000000009089

Sample Output

3 16 18 29 189 290 15645897 1897456322 11400000000 11500000000 1

【题解】

用快排排一遍,相同的数字会连续出现,输出时注意下就好。

【代码】

#include <cstdio>const int MAXN = 200000+10;int n,a[MAXN];void input_data() //输入数据 {scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&a[i]);}void q_sort(int l,int r) //快排 {int m = a[(l+r)/2];int i = l,j = r;do{while (a[i] < m) i++;while (m < a[j]) j--;if (i <= j) {int t = a[i];a[i]=a[j];a[j]=t;i++;j--;}} while (i<=j);if (l < j) q_sort(l,j);if (i < r) q_sort(i,r);}void get_put_ans() //输出答案 {int i = 1;while (i <= n){int j = i+1;while ( a[j] == a[i]) j++;printf("%d %d\n",a[i],j-i);i = j;}}int main(){input_data();q_sort(1,n);get_put_ans();return 0;}


 

0 0
原创粉丝点击