首页 > 试题广场 >

寻找大富翁

[编程题]寻找大富翁
  • 热度指数:6115 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.

输入描述:
    每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.


输出描述:
    请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
示例1

输入

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 cmp(int *a,int *b)
{
    return *b-*a;
}
int main()
{
    int n,m,a[100000];
    while(scanf("%d%d",&n,&m)!=EOF && n*m!=0)
    {
        if(m>n)m=n;
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        qsort(a,n,4,cmp);
        for(int i=0;i<m;i++)printf("%d ",a[i]);
        printf("\n");
    }
}

编辑于 2020-02-09 23:18:25 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b){
    return a>b;
}
int main(){
    int n,m;
    while(cin>>n>>m){
        int* money=new int[n];
        for(int i=0;i<n;i++)
            cin>>money[i];
        sort(money,money+n,cmp);
        if(m>=n){
            for(int i=0;i<n;i++)
                cout<<money[i]<<' ';
        }
        else{
            for(int i=0;i<m;i++)
                cout<<money[i]<<' ';
        }
        cout<<endl;
    }
}

发表于 2019-03-02 15:37:17 回复(0)
#include<stdio.h>
int main()
{
    int i,j,n,m,a[100001];
    scanf("%d%d",&n,&m);
    //1.输入
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    //2.找m个最大的
    int num=0,max,maxindex,n1=n;//保证输出个数别超出n个
    for(i=0;i<m;i++)
    {
        max=a[0];maxindex=0;
        for(j=1;j<n;j++)
            if(a[j]>max)
			{
				max=a[j];maxindex=j;
			}
		//把最大值消除循环前移
		for(j=maxindex;j<n-1;j++)
			a[j]=a[j+1];
		n--;//数组减掉一位
        num++;//表示要出输出一个数
        if(num<=n1)
            printf("%d ",max);
        else
            break;
    }
	return 0;
}

编辑于 2020-04-13 14:59:36 回复(0)
还ok
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main(void)
{
    int n,m,i,j;
    while(cin>>n>>m)
    {
        int a[n];
        for(i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);
        if(m<=n)
        {
            cout<<a[n-1];
            for(i=n-2;i>=n-m;i--)
                cout<<" "<<a[i];
        }
        else
        {
            cout<<a[n-1];
            for(i=n-2;i>=0;i--)
                cout<<" "<<a[i];
        }
        cout<<endl;
    }
    return 0;
}
发表于 2019-11-24 16:07:50 回复(0)

Python的切片特别好用

while True:
    try:
        n,m = list(map(int,input().split()))
        peoples = list(map(int,input().split()))
        peoples.sort(reverse=True)
        print(" ".join(map(str,peoples[:m])))
    except Exception:
        break
编辑于 2018-09-27 14:11:18 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int m,n;
    while(cin>>n>>m)
    {
        int a[n];
        for(int i=0;i<n;cin>>a[i++]);
        sort(a,a+n);
        cout<<a[n-1];
        for(int i=n-2;i>=max(n-m,0);cout<<' '<<a[i--]);
        cout<<endl;
    }
}

发表于 2018-08-17 23:19:04 回复(1)
感觉这道题的正确姿势应该是用堆排序,毕竟m的值非常小
不过我偷懒直接用的快速排序
#include <stdio.h>
#include <algorithm>
#define N 100000
using namespace std;

int buf[N];

bool cmp(int a, int b)
{
    return a>b;
}

int main()
{
    int n, m;
    while(scanf("%d %d", &n, &m)!=EOF)
    {
        for(int i=0; i<n; i++) scanf("%d", &buf[i]);
        sort(buf, buf+n, cmp);
        if(m>n) m=n;
        bool isFirst=true;
        for(int i=0; i<m; i++)
        {
            if(isFirst) isFirst=false;
            else printf(" ");
            printf("%d", buf[i]);
        }
        printf("\n");
    }
    return 0;
}

编辑于 2018-03-08 20:36:07 回复(0)
while True:
    try:
        m, n = map(int, raw_input().strip().split())
        if m or n:
            richList = map(int, raw_input().strip().split())
            richList.sort()

            while n and len(richList)!=0:
                print richList.pop(),
                n -= 1
        elif m==0 and n==0:
            break
        print 

    except:
        break

发表于 2016-06-27 10:46:24 回复(0)
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) {
        Scanner in=new Scanner(System.in); int n,m; while (in.hasNext())
        {
            n=in.nextInt();
            m=in.nextInt(); if(n==0&&m==0) break; int[] arr=new int[n]; for(int i=0;i<n;i++)
                arr[i]=in.nextInt(); Arrays.sort(arr); int j=0; for(j=arr.length-1;j>=arr.length-m;j--)
            { if(j>=0)
                    System.out.print(arr[j]+" ");
            }
            System.out.println();
        }
    }
}

发表于 2016-11-05 19:23:57 回复(0)
def quick_sort(a, l, r):
    if l >= r:
        return a
    first = l
    last = r
    m = a[l]

    while first < last:
        if first < last and a[last] <= m:
            last-=1
        a[first] = a[last]

        if first < last and a[first] >= m:
            first+=1
        a[last] = a[first]
    a[first] = m
    quick_sort(a, l, first-1)
    quick_sort(a, first+1, r)

    return a

    if l >= r:
        return a[l:r]
    


def bigrich(l, n,m):
    res=quick_sort(l, 0, n-1)
    arr=[]
    for i in res:
        arr.append(str(i))
    res = arr
    if m > n:
        print(' '.join(res))
    else:
        print(' '.join(res[:m]))


while True:
    try:
        n, m = map(int, input().split())
        l = list(map(int, input().split()))
        bigrich(l, n, m)
    except:
        break

编辑于 2024-03-26 20:58:18 回复(0)
#include<stdio.h>
#include<queue>
using namespace std;
int main(){
    priority_queue<int> Myqueue;
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++){
            int tmp;
            scanf("%d",&tmp);
            Myqueue.push(tmp);
        }

        for(int i=0;i<m;i++){
            if(Myqueue.size()==0) break;
            printf("%d ",Myqueue.top());
            Myqueue.pop();
        }

        printf("\n");
    }
}

发表于 2024-03-18 20:58:18 回复(0)
#include <iostream>
#include <queue>
using namespace std;

int main() {
    int n, m;
    while (cin >> n >> m) {
        priority_queue<int>myPriorityQueue;
        while (n--) {
            int data;
            cin >> data;
            myPriorityQueue.push(data);
        }
        while (m-- && !myPriorityQueue.empty()) {
            cout << myPriorityQueue.top() << " ";
            myPriorityQueue.pop();
        }
        cout << endl;
    }
    return 0;
}

发表于 2024-03-02 18:32:14 回复(0)
//采用优先队列的做法,原理就是大根堆了
#include "stdio.h"
#include "queue"
using namespace std;

int main(){
    int n,m;//n为镇上人数,m为要找的大富翁数
    priority_queue<int> myPQueue;
    int temp;
    while(scanf("%d%d",&n,&m) != EOF){
        if(n==0 && m==0)
            break;
        for(int i=0; i<n; ++i){
            scanf("%d",&temp);
            myPQueue.push(temp);
        }
        if(n >= m){
        	for(int i=0; i<m; ++i){
        		printf("%d ",myPQueue.top());
                myPQueue.pop();
        	}
		}else{
			for(int i=0; i<n; ++i){
				printf("%d ",myPQueue.top());
				myPQueue.pop();
			}
		}
        printf("\n");
    }
}

发表于 2023-03-27 21:48:18 回复(0)
#include <cstdio>
#include <algorithm>
using namespace std;

bool comp(int lhs, int rhs) {
    return lhs > rhs; //降序排序
}

int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) != EOF) {
        int arr[n];
        for(int i = 0; i < n; ++i){
            scanf("%d", &arr[i]);
        }
        sort(arr, arr + n, comp);
        if (n>m) {
            for(int i = 0; i < m; ++i){
                printf("%d ",arr[i]);
            }
            printf("\n");
        }else{ //n<m
            for(int i = 0; i < n; ++i){
                printf("%d ",arr[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

发表于 2023-03-15 22:58:53 回复(0)

include

include

using namespace std;
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,m;
while(cin>>n>>m){
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n,cmp);
if(n>m){
for(int i=0;i<m;i++){
cout<<a[i]<<" ";
}
}
else{
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
cout<<endl;
}
return 0;
}

发表于 2023-03-06 15:51:56 回复(0)
怎么简单怎么来
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;

int main() {
    int n,m;
    while(scanf("%d%d",&n,&m)!=-1){
        if(n==0){
            break;
        }
        
        priority_queue<int> myqueue;
        for(int i=0;i<n;i++){
            int temp;cin>>temp;
            myqueue.push(temp);
        }

        for(int i=0;!myqueue.empty()&&i<m;i++){
            cout<<myqueue.top()<<" ";
            myqueue.pop();
        }
        cout<<endl;
    }
}


发表于 2023-02-18 23:42:25 回复(0)
//ky123寻找大富翁
#include<algorithm>
#include<stdio.h>

using namespace std;

int main(){
	int n,m;
	while(scanf("%d %d",&n,&m)!=EOF){
		if(n==0 && m==0)
			break;
		else{
			int *num=(int *)malloc(sizeof(int)*n);
			for(int i=0;i<n;i++){
				int temp;
				scanf("%d",&temp);
				num[i]=temp;
			}
			if(m>=n){
				sort(num,num+n);
				for(int j=n-1;j>=0;j--)
					printf("%d ",num[j]);
			}
			else{
				sort(num,num+n);
				for(int k=n-1;k>=n-m;k--)
					printf("%d ",num[k]);
			}
		}
		printf("\n");
	}
}

发表于 2022-01-29 21:36:08 回复(0)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int N=100005;
bool cmp(int a,int b)
{
	return a>b;
}
int main(void)
{
	int n,m; 
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int a[N];
		for(int i=0;i<n;i++) scanf("%d",&a[i]);
		sort(a,a+n,cmp);
		if(n>m)
		for(int i=0;i<m;i++) printf("%d ",a[i]);
		else
		for(int i=0;i<n;i++) printf("%d ",a[i]);
		puts("");
	}
	return 0;
}
样例真的坑,我以为 n=0 m=0 程序才结束。。。。。
发表于 2021-04-08 22:12:51 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,m;
    while(cin>>n>>m){
        int arr[n];
        for(int i=0;i<n;i++)
            scanf("%d",&arr[i]);
        sort(arr,arr+n);
        if(n>=m)
        for(int i=n-1;i>=n-m;i--)
            printf("%d ",arr[i]);
        else for(int i=n-1;i>=0;i--)
            printf("%d ",arr[i]);
        }
    }
发表于 2021-03-18 22:54:31 回复(0)
//优先级队列解决

#include<iostream>
#include<queue>
using namespace std;

int main(){
    int n, m;
    priority_queue<int> qu;
    
    while(cin>>n>>m && n){
        while(!qu.empty()) qu.pop();
        int tmp;
        
        for(int i=0; i<n; i++){
            cin>>tmp;
            qu.push(tmp);
        }
        
        for(int i=0; i<n && i<m; i++){
            cout<<qu.top()<<' ';
            qu.pop();
        }
        cout<<endl;
    }
    return 0;
}

发表于 2021-03-12 22:40:40 回复(0)

问题信息

难度:
44条回答 5533浏览

热门推荐

通过挑战的用户

查看代码