一开始这种做法超时:
#include<stdio.h>int b[5000000],a[5000000],n,ans;
void merge_sort(int *a,int *b,int x,int y)
{if(y-x>1){int m=x+(y-x)/2;//中间点的坐标int p=x,q=m,i=x;merge_sort(a,b,x,m);merge_sort(a,b,m,y);while(p<=m||q<y){if(q>=y||(p<m&&a[p]<=a[q]))b[i++]=a[p++];//从左半数组复 制到临时空间else b[i++]=a[q++];// 从右半 数组复制到临时空间}for(i=x;i<y;i++)a[i]=b[i];}
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);int mid=n/2;merge_sort(a,b,0,n);for(int i=0;i<n;i++){ans=1;for(int j=i+1;j<n;j++){if(a[j]>a[i])break;ans++;i=j;}printf("%d %d\n",a[i],ans);}return 0;
}
AC:
#include<stdio.h>
#include<string.h>
int main()
{int i,j,n,m,k,t,a[101];scanf("%d",&n);memset(a,0,sizeof(a));for(i=0;i<n;i++){scanf("%d",&m);if(m>=100)a[100]++;elsea[m]++;}for(i=0;i<101;i++)if(a[i]!=0)printf("%d %d\n",i,a[i]);
}