首页 > 代码库 > 九度OJ 1034 寻找大富翁
九度OJ 1034 寻找大富翁
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:5168
解决:2075
- 题目描述:
- 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
- 输入:
- 输入包含多组测试用例.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
- 输出:
- 请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
- 样例输入:
3 1 2 5 -1 5 3 1 2 3 4 5 0 0
- 样例输出:
5 5 4 3
#include<stdio.h> #include<string.h> 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[]) { 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]); m_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; } /************************************************************** Problem: 1034 User: kirchhoff Language: C Result: Accepted Time:30 ms Memory:1696 kb ****************************************************************/
九度OJ 1034 寻找大富翁
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。