P1097 统计数字

时间:2023-03-09 22:24:47
P1097 统计数字

P1097题库链接:https://www.luogu.org/problem/P1097

难度:普及-

算法标签:模拟,排序,概率论

1.桶模拟 O(n) 得分20

由于题目让统计数出现的次数,并按从小到大输出结果,很容易让人想到桶排序,但题目上说所输入的数不超过1500000000(1.5 * 10^9),这意味着若想完全统计,空间开销将会非常大

 #include <cstdio>
using namespace std;
int a[];
int main()
{
int n;
scanf("%d", &n);
for(int i = ; i <= n; ++i)
{
int k;
scanf("%d", &k);
++a[k];
}
for(int i = ; i <= ; ++i)
if(a[i] != )
printf("%d %d\n", i, a[i]);
return ;
}

2.map优化 O(n) 得分100

利用STL中的map容器解决桶排桶过多所导致的空间开销巨大,虽然不相同的数不超过10000个,但输入的总个数可能会非常多,所以数组一定要开大

 #include <algorithm>
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
map <int, int> a;
int s[];
int main()
{
int n;
scanf("%d", &n);
for(int i = ; i < n; ++i)
{
scanf("%d", &s[i]);
++a[s[i]];
}
sort(s, s + n);
for(int i = ; i < n; ++i)
if(s[i] != s[i - ])
printf("%d %d\n", s[i], a[s[i]]);
return ;
}