【模拟】洛谷 P1097 统计数字

xiaoxiao2021-02-28  80

题目描述

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

输入输出格式

输入格式: 输入文件count.in包含n+1行;

第一行是整数n,表示自然数的个数;

第2~n+1每行一个自然数。

输出格式: 输出文件count.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

输入输出样例

输入样例#1: 8 2 4 2 4 5 100 2 100

输出样例#1: 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*109)

NOIP 2007 提高第一题

代码

#include<iostream> using namespace std; long long a[200005],temp[200005]; void mergesort(int left,int right) { if(left==right)return ; int mid=(left+right)/2; mergesort(left,mid); mergesort(mid+1,right); int i=left,j=mid+1,k=left; while(i<=mid&&j<=right) { if(a[i]>a[j])temp[k++]=a[j++]; else temp[k++]=a[i++]; } while(i<=mid)temp[k++]=a[i++]; while(j<=right)temp[k++]=a[j++]; for(int m=left;m<=right;m++)a[m]=temp[m]; } int main() { int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; mergesort(0,n-1); int sum=1; cout<<a[0]; long long x=a[0]; for(int i=1;i<n;i++) { if(a[i]==x)sum++; else { cout<<' '<<sum<<endl; cout<<a[i]; x=a[i]; sum=1; } } cout<<' '<<sum; return 0; }
转载请注明原文地址: https://www.6miu.com/read-47972.html

最新回复(0)