HDU 3785 寻找大富翁 (排序)

2015-01-24 09:22:00 · 作者: · 浏览: 4

寻找大富翁

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4132 Accepted Submission(s): 1698


Problem Description 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
Input 输入包含多组测试用例.
每个用例首先包含2个整数n(0 n和m同时为0时表示输入结束.
Output 请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
Sample Input
3 1
2 5 -1
5 3
1 2 3 4 5
0 0

Sample Output
5
5 4 3
#include
   
    
#include
    
      #include
     
       using namespace std; int a[100010]; int aux[100010]; void swap(int *a,int *b){ int t=*a; *a=*b; *b=t; } int partition(int a[],int l,int h){ int i=l; int j=h+1; int v=a[l]; while(1){ while(a[++i]>v)if(i==h)break; while(a[--j]
      
       =j)break; swap(&a[i],&a[j]); } swap(&a[l],&a[j]); return j; } void q_sort(int a[], int l,int h){ if(l>=h)return; int j=partition(a,l,h); q_sort(a,l,j-1); q_sort(a,j+1,h); } void merge(int a[],int l,int mid,int h){ int i=l; int j=mid+1; for(int k=l;k<=h;++k) aux[k]=a[k]; for(int k=l;k<=h;++k){ if(i>mid)a[k]=aux[j++]; else if(j>h)a[k]=aux[i++]; else if(aux[i]>aux[j])a[k]=aux[i++]; else a[k]=aux[j++]; } } void m_sort(int a[],int l,int h){ if(h<=l)return ; int mid=l+(h-l)/2; m_sort(a , l , mid); m_sort(a,mid+1,h); merge(a,l,mid,h); } int main(int argc, char *argv[]) { freopen("3785.in","r",stdin); int n,m; while(scanf("%d%d",&n,&m)==2) { memset(a,0,sizeof(a)); if(n==0&&m==0)return 0; for(int i=0;i
       
        
归并和快速各写了次~