OJ_1034 寻找大富翁

来源:互联网 发布:中文文本分析软件 编辑:程序博客网 时间:2024/05/20 09:09
#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 12 5 -15 31 2 3 4 50 0
样例输出:
55 4 3

0 0
原创粉丝点击