1239:統計數字

 

【題目描述】

某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5×109)。已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。

【輸入】

第一行是整數n,表示自然數的個數;

第2 n+1每行一個自然數。

【輸出】

包含m行(mn個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。

【輸入樣例】

8
2
4
2
4
5
100
2
100

【輸出樣例】

2 3
4 2
5 1
100 2

【提示】

數據範圍:

40%的數據滿足:1≤n≤1000;

80%的數據滿足:1≤n≤50000;

100%的數據滿足:1≤n≤200000,每個數均不超過1500000000(1.5×109)。

本題目禁止使用STL及包含可以使用的相關調用。

注意: 提示和題目不一樣,開大數組



#include <iostream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int idata=1e5+5;
ll minn=inf,maxx=-inf;
ll n,ans,t,k;
char *ch;
ll step[200000+5];
ll temp[200000+5];
ll cnt,len;
ll query,judge,flag;

void merge_sort(int l,int r)
{
    if(l==r) return;
    int mid=(l+r)/2;
    merge_sort(l,mid);
    merge_sort(mid+1,r);
    int i=l,j=mid+1,point=l;

    while(i<=mid&&j<=r)
    {
        if(step[i]<step[j])
            temp[point++]=step[i++];
        else
            temp[point++]=step[j++];
    }
    while(i<=mid)
        temp[point++]=step[i++];
    while(j<=r)
        temp[point++]=step[j++];
    for(int i=l;i<=r;i++)
        step[i]=temp[i];
}
int main()
{
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
            cin>>step[i];
        merge_sort(1,n);

        cnt=1;
        for(int i=1;i<=n;i++)
        {
            if(step[i]==step[i+1])
                cnt++;
            else
            {
                cout<<step[i]<<" "<<cnt<<endl;
                cnt=1;
            }
        }
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章