题3:历史长河
【题目描述】
在人类几千年的历史长河中,发生过无数的重要事件,有的影响世界的格局,有的影响人类的命运。
现在给出 n 个历史事件所出现的年份 a𝑖 (年份可能为负,为负表示公元前),需要你来统计哪些年份发生过重要事件,以及每一年发生过多少个事件。你需要按照年份从小到大的顺序输出年份以及此年发生过多少个事件。
【输入】
第一行一个整数 n,表示历史事件的数量。
第二行 n 个整数 a1, a2 ,……,a𝑛 表示每个历史事件所出现的年份。
【输出】
每一行输出两个整数,第一个整数表示年份,第二个整数表示此年发生过多少个事件,空格隔开。按照年份从小到大的顺序输出。
【输入样例1】
5
2020 2021 1999 2021 2020
【输出样例1】
1999 1
2020 2
2021 2
【输入样例2】
5
2023 -200 200 2023 2023
【输出样例2】
-200 1
200 1
2023 3
【数据规模及约定】
对于30%的数据,1 ≤ n ≤ 100,0 ≤ a ≤ 2024,且不存在重复的年份。
对于60%的数据,1 ≤ n ≤ 2×105,0 ≤ a ≤2024。
对于100%的数据,1 ≤ n ≤ 2×105,-2024 ≤ a𝑖 ≤ 2024。
题目解析:
**根据题意,数据规模达到2x105,如果使用暴力必定会出现超时,所以需想减少时间复杂度。
题目实际是要求统计同一年份事件次数的累加和,并需按年份从小到大排序,自然是桶排序是最合适的。
**
代码如下:
#include <bits/stdc++.h>
using namespace std;
int a[4055],n,x;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
a[x+2025]++;
}
for(int i=1;i<=4050;i++)
if(a[i])
cout<<i-2025<<" "<<a[i]<<endl;
return 0;
}