HDOj-1425

sort

Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 40503    Accepted Submission(s): 11823


Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
 
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
 
Output
对每组测试数据按从大到小的顺序输出前m大的数。
 
Sample Input
5 3
3 -35 92 213 -644
 
 
Sample Output
213 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
",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("
");
48         }
49     }
50     return 0;
51 } 
原文地址:https://www.cnblogs.com/Kiven5197/p/5483725.html