首页 > 代码库 > HDU 3785 寻找大富翁 (排序)
HDU 3785 寻找大富翁 (排序)
寻找大富翁
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<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
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<iostream> #include<stdio.h> #include<string.h> 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]<v)if(j==l)break; if(i>=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<n;++i) scanf("%d",&a[i]); q_sort(a,0,n-1); for(int i=0;;++i) { if(m)printf("%d",a[i]); m--; if(m)printf(" "); if(m==0)break; } printf("\n"); } return 0; }
归并和快速各写了次~
HDU 3785 寻找大富翁 (排序)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。