P1097题库链接:https://www.luogu.org/problem/P1097
难度:普及-
算法标签:模拟,排序,概率论
1.桶模拟 O(n) 得分20
由于题目让统计数出现的次数,并按从小到大输出结果,很容易让人想到桶排序,但题目上说所输入的数不超过1500000000(1.5 * 10^9),这意味着若想完全统计,空间开销将会非常大
1 #include <cstdio> 2 using namespace std; 3 int a[400000000]; 4 int main() 5 { 6 int n; 7 scanf("%d", &n); 8 for(int i = 1; i <= n; ++i) 9 { 10 int k; 11 scanf("%d", &k); 12 ++a[k]; 13 } 14 for(int i = 1; i <= 400000000; ++i) 15 if(a[i] != 0) 16 printf("%d %d\n", i, a[i]); 17 return 0; 18 }
2.map优化 O(n) 得分100
利用STL中的map容器解决桶排桶过多所导致的空间开销巨大,虽然不相同的数不超过10000个,但输入的总个数可能会非常多,所以数组一定要开大
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdio> 4 #include <map> 5 using namespace std; 6 map <int, int> a; 7 int s[50000]; 8 int main() 9 { 10 int n; 11 scanf("%d", &n); 12 for(int i = 0; i < n; ++i) 13 { 14 scanf("%d", &s[i]); 15 ++a[s[i]]; 16 } 17 sort(s, s + n); 18 for(int i = 0; i < n; ++i) 19 if(s[i] != s[i - 1]) 20 printf("%d %d\n", s[i], a[s[i]]); 21 return 0; 22 }