HDOj-1425
sort
Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 40503 Accepted Submission(s): 11823Problem Description给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input5 33 -35 92 213 -644Sample Output213 92 3
其实就是一排序问题,我想麻烦了。。开了两个数组,一个储存0~正数,一个储存负数。是显得麻烦了,绕了一圈最后也一发A了。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 const int MAX=1010000; 8 9 int n,m; 10 int a[MAX]; 11 int b[MAX]; 12 13 int main(){ 14 while(~scanf("%d %d",&n,&m)){ 15 int t=0; 16 memset(a,0,sizeof(a)); 17 memset(b,0,sizeof(b)); 18 for(int i=0;i<n;i++){ 19 scanf("%d",&a[i]); 20 if(a[i]>=0){ 21 b[t++]=a[i];//储存大于等于0的数 22 a[i]=0; 23 } 24 } 25 stable_sort(a,a+n-1);//稳定 26 stable_sort(b,b+t); 27 if(t+1>=m){ 28 for(int i=t-1;i>t-m;i--){ 29 printf("%d ",b[i]); 30 } 31 printf("%d\n",b[t-m]); 32 } 33 else{ 34 printf("%d",b[t-1]); 35 for(int i=t-2;i>=0;i--){ 36 printf(" %d",b[i]); 37 m--; 38 } 39 for(int i=n-t-1;i>=0;i++){ 40 if(m==0) 41 break; 42 if(a[i]!=0){ 43 printf(" %d",a[i]); 44 m--; 45 } 46 } 47 printf("\n"); 48 } 49 } 50 return 0; 51 }