题目描述
某次科研调查时得到了 nn 个自然数,每个数均不超过 1500000000(1.5 \times 10^9)1500000000(1.5×109) 。已知不相同的数不超过 1000010000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入输出格式
输入格式:共 n+1n+1 行。
第一行是整数 nn ,表示自然数的个数;
第 22 至 n+1n+1 每行一个自然数。
输出格式:共 mm 行( mm 为 nn 个自然数中不相同数的个数),按照自然数从小到大的顺序输出。
每行输出 2
2 个整数,分别是自然数和该数出现的次数,其间用一个空格隔开
输入输出样例
。
说明
40\%40% 的数据满足: 1 \le n \le 10001≤n≤1000
80\%80% 的数据满足: 1 \le n \le 500001≤n≤50000
100\%100% 的数据满足: 1 \le n \le 2000001≤n≤200000 ,每个数均不超过 1500 000 000(1.5 \times 109)1500000000(1.5×109)
我的思路是先排序,然后再统计
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int MAXN=200000; long long num[MAXN],temp[MAXN]; int tot[MAXN]; int main() { int n; scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%lld",&num[i]); sort(num+1,num+1+n); int idx=1; for(int i=1; i<=n; i++) { if(num[i]!=num[i+1]) tot[idx]++,idx++; else tot[idx]++; } int sum=0; for(int i=1;i<idx;i++){ sum+=tot[i]; cout<<num[sum]<<" "<<tot[i]<<endl; } }