Description
某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*10^9)。已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。
Input
每組輸入數據包含n+1行
第一行是整數n,表示自然數的個數
第2~n+1行,每行一個自然數。
1<=n<=200000,每個數均不超過1500000000(1.5*10^9)
Output
每組輸出包含m行(m為n個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。
Sample Input 1
8
2
4
2
4
5
100
2
100
Sample Output 1
2 3
4 2
5 1
100 2
解題思路:
(1)這道題只需將重復的數字記錄下來,但是不能單純的用一個int 數組記錄,因為題目給數字最大可到達1500000000(1.5*10^9),所以數組會爆掉,沒辦法存那么大的數字,所以此題用一個map數組存,(map數組的底層是紅黑樹,具體可自己去了解知識)
(2)題目給的時間是2s ,下面代碼時間復雜度是n*logn;題目n最大200000,再乘以log200000,不超過題目給的時間,不會超時
(3)注意輸出結果是從小到大輸出,所以sort;
代碼如下:
1 #include<iostream> 2 #include<map> 3 #include<algorithm> 4 using namespace std; 5 6 map<int,int>mp;//用一個map數組記錄,且不用將mp初始化為0,因為系統自動初始化為0;注意要頭文件map 7 map<int,int>vis;//用來記錄 8 int n ; 9 long long int a[200005]; 10 int main() 11 { 12 cin>>n; 13 14 for(int i = 1 ; i <= n ;i++) 15 { 16 cin>>a[i]; 17 mp[a[i]]++; //將重復的數字記錄下來,計算一下相同的a[i]有幾個; 18 } 19 20 sort(a,a+n); //排序,注意要頭文件 algorithm 21 for(int i = 1;i <= n;i++) 22 { 23 if(mp[a[i]]!=0&&vis[a[i]]==0) //如果mp[a[i]]!=0,且a[i]不相同,沒被訪問過 24 { 25 cout<<a[i]<<" "<<mp[a[i]]; 26 cout<<endl; 27 vis[a[i]]=1; //將輸出的a[i]記錄下來,記錄它已訪問過了; 28 } 29 } 30 31 return 0; 32 }