题目描述
某次科研调查时得到了n个自然数,每个数均不超过1500000000 (1.5×109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入
第1行是整数n,表示自然数的个数;
第2~n+1每行一个自然数。
输出
共m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
样例输入
8 2 4 2 4 5 100 2 100
样例输出
2 3 4 2 5 1 100 2
提示
100%的数据满足:1≤n≤200000,每个数均不超过1.5×109。
需要的知识:C++STL
C的结构体
思路:首先先创建结构体准备储存出现的数以及他所出现的次数,那这是次数我们可以直接用map进行桶排序那么出现怎么去重呢?这个时候就有STL中的unique帮我们去重
这是从百度百科上弄的unique使用代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100000;
int a[N+5];
int main()
{
int n;
while (cin>>n)
{
for (int i = 0;i < n;++i)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
n = unique(a,a+n) - a;
for (int i = 0;i < n;++i)
{
printf("%d ",a[i]);
}
puts("");
}
return 0;
}
那么会用unique也就不难解开这道题:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
long long a[N];
struct s
{
long long num;
long long sum;
}s[100001];
bool cmp(struct s a,struct s b)
{
return a.num<b.num;
}
long long n,m,i;
int main()
{
map<long long,int>mp;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]]++;
}
sort(a+1,a+n+1);
n=unique(a+1,a+1+ n)-(a+1);
for(i=1;i<=n;i++)
{
s[i].num=a[i];
s[i].sum=mp[a[i]];
}
sort(s+1,s+1+n,cmp);
for(i=1;i<=n;i++)
{
cout<<s[i].num<<" "<<s[i].sum<<endl;
}
return 0;
}
注意:数比较大,map前边用long long.