OJ_1034 寻找大富翁

#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
     int temp=a;
     a=b;
     b=temp;
}
// 大根堆 
void heapify(int *ary,int i,int size)
{
    int l,r,max;
    while(i<size)
    {
                 l=2*i+1;
                 r=l+1;
                 max=i;
                 if(l<size&&ary[i]<ary[l])
                          i=l;
                 if(r<size&&ary[i]<ary[r])
                          i=r;
                 if(max!=i)
                           swap(ary[i],ary[max]);
                 else
                     break;
    }
}
void buildheap(int *ary,int size)
{
     for(int i=(size-2)/2;i>=0;i--)
             heapify(ary,i,size);

}
void func()
{
     int n,m;
     while(cin>>n>>m)
     {
                     int ary[n];
                     if(n==0&&m==0)break;
                     for(int i=0;i<n;i++)
                     {
                             cin>>ary[i];
                     }                
                     buildheap(ary,n);
                     
                    int j;
                    for(j=0;j<m-1;j++)
                    {
                     if(j<n-1){
                               swap(ary[0],ary[n-1-j]);
                               cout<<ary[n-1-j]<<" ";
                               heapify(ary,0,n-1-j);
                     }
                    }
                     swap(ary[0],ary[n-1-j]);
                      cout<<ary[n-1-j]<<endl;
     }

}
int partition(int *ary,int l,int r)
{
    int m=((r-l)>>1)+l;
    swap(ary[l],ary[m]);
    int i=l,j=r;
    int key=ary[l];
    while(i<j){
               while(i<j&&ary[j]>=key)j--;
               ary[i]=ary[j];
               while(i<j&&ary[i]<=key)i++;
               ary[j]=ary[i];
               
    }
    ary[i]=key;
    return i;
               
}
void quicksort(int *ary,int l,int r)
{
     
     if(l<r){
             int m=partition(ary,l,r);
             quicksort(ary,l,m-1);
             quicksort(ary,m+1,r);
     }
}
void func1()
{
     int n,m;
     while(cin>>n>>m)
     {
                     int ary[n];
                     if(n==0&&m==0)break;
                     for(int i=0;i<n;i++)
                             cin>>ary[i];
                     quicksort(ary,0,n-1);
                     int j=0;
                     for(;j<m-1;j++)
                     {
                             if(j<n-1){
                                       cout<<ary[n-1-j]<<" ";
                             }
                     }
                     cout<<ary[n-1-j]<<endl;
     }
 }
int main(int argc, char *argv[])
{
	//printf("Hello, world\n");
	//func();
	func1();
	return 0;
}

快速排序或堆排序或其他排序,比如计数排序

题目描述:
    浙江桐乡乌镇共有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值