信息学奥赛一本通(1239:统计数字)
1239:統(tǒng)計數(shù)字
時間限制: 1000 ms ??? ??? 內(nèi)存限制: 65536 KB
提交數(shù): 6439 ??? 通過數(shù): 2627
【題目描述】
某次科研調(diào)查時得到了n個自然數(shù),每個數(shù)均不超過1500000000(1.5×10^9)。已知不相同的數(shù)不超過10000個,現(xiàn)在需要統(tǒng)計這些自然數(shù)各自出現(xiàn)的次數(shù),并按照自然數(shù)從小到大的順序輸出統(tǒng)計結(jié)果。
【輸入】
第一行是整數(shù)n,表示自然數(shù)的個數(shù);
第2?n+1 每行一個自然數(shù)。
【輸出】
包含m行(m為n個自然數(shù)中不相同數(shù)的個數(shù)),按照自然數(shù)從小到大的順序輸出。每行輸出兩個整數(shù),分別是自然數(shù)和該數(shù)出現(xiàn)的次數(shù),其間用一個空格隔開。
【輸入樣例】
8 2 4 2 4 5 100 2 100【輸出樣例】
2 3 4 2 5 1 100 2【提示】
數(shù)據(jù)范圍:
40%的數(shù)據(jù)滿足:1≤n≤1000;
80%的數(shù)據(jù)滿足:1≤n≤50000;
100%的數(shù)據(jù)滿足:1≤n≤200000,每個數(shù)均不超過1500000000(1.5×10^9)。
本題目禁止使用STL及包含可以使用的相關(guān)調(diào)用。
【分析】
? ? ? ? 從題目可以看出,先排序,然后相鄰比較,如果相同,則統(tǒng)計個數(shù),如果不同,則繼續(xù)相鄰比較。提到排序,與分治相關(guān)的就是快速排序,歸并排序 和 堆排序。
? ? ? ? 注意:(1)禁止使用STL及包含可以調(diào)用的相關(guān)調(diào)用。(2)由于數(shù)據(jù)規(guī)模較大,不能用桶排序,冒泡排序,選擇排序等等。
【參考代碼1】
#include <stdio.h> #define N 200010int a[N],tmp[N]; int cnt;void merge(int left,int mid,int right) {int i,j,k;i=left;j=mid+1;k=left;while(i<=mid && j<=right){if(a[i]>a[j]){cnt+=j-k;tmp[k++]=a[j++];}else{tmp[k++]=a[i++];}}while(i<=mid)tmp[k++]=a[i++];while(j<=right)tmp[k++]=a[j++];for(i=left;i<=right;i++)a[i]=tmp[i]; } void merge_sort(int left,int right) // 歸并排序 {int mid;if(left==right)return;mid=(left+right)/2;merge_sort(left,mid);merge_sort(mid+1,right);merge(left,mid,right); } int main() {int i,n,num=1;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);merge_sort(1,n);for(i=1;i<=n;i++){if(a[i]==a[i+1])num++;else{printf("%d %d\n",a[i],num);num=1;}}return 0; }?【參考代碼2】
#include <stdio.h> #define N 200010int a[N];void qqsort(int l,int r) //快速排序 {int i,j,mid,p;i=l;j=r;mid=a[(l+r)/2];do{while(a[i]<mid)i++;while(a[j]>mid)j--;if(i<=j){p=a[i];a[i]=a[j];a[j]=p;i++;j--;}}while(i<=j);if(l<j)qqsort(l,j);if(i<r)qqsort(i,r); }int main() {int i,n,num=1;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);qqsort(1,n);for(i=1;i<=n;i++){if(a[i]==a[i+1])num++;else{printf("%d %d\n",a[i],num);num=1;}}return 0; }【參考代碼3】
#include <stdio.h> #include <string.h> #define N 200010 #define INF 0x3f3f3f3f int a[N];void swap(int arr[],int i,int j) //交換樹中兩個結(jié)點值 {int tmp;tmp=arr[i];arr[i]=arr[j];arr[j]=tmp; } void heapify(int tree[],int n,int i) //調(diào)整大根堆 {int c1,c2,max;if(i>=n)return;c1=2*i+1;c2=2*i+2;max=i;if(c1<n && tree[c1] > tree[max])max=c1;if(c2<n && tree[c2] > tree[max])max=c2;if(max!=i){swap(tree,max,i);heapify(tree,n,max);} } void build_heap(int tree[],int n) //建大根堆 {int last_node = n-1;int parent = (last_node-1)/2;int i;for(i=parent;i>=0;i--)heapify(tree,n,i); } void heap_sort(int tree[],int n) //堆排序 {int i;build_heap(tree,n);for(i=n-1;i>=0;i--){swap(tree,i,0);heapify(tree,i,0);} }int main() {int i,n,num=1;memset(a,INF,sizeof(a));scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);heap_sort(a,n);for(i=0;i<n;i++){if(a[i]==a[i+1])num++;else{printf("%d %d\n",a[i],num);num=1;}}return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1239
總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通(1239:统计数字)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 1138:将字符串中的
- 下一篇: 信息学奥赛一本通(2061:【例1.2】