细节训练——7-1 寻找大富翁(25 分)

466 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

题目描述:

胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。

输入格式:

输入首先给出两个正整数N(≤106)和M(≤10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。

输出格式:

在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。

输入样例:

8 3
8 12 7 3 20 9 5 18

输出样例:

20 18 12

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB

思路分析:

用vector的仿函数排序规则,我们可以让所有富翁从高到低排序

再输出前m位即可

但是大家会发现,这样做只能拿到24分,不能够AC,那么是出现了什么问题呢?

image.png 我们仔细阅读的话会发现——如果富翁数目小于要输出的个数会怎么办?所有这题目的关键点就出现在这里!

如何解决
我们只需要在要输出前判断一下m的大小即可,如果m比n大的话,我们让m=n,这样既不影响后面的输出,也可以做到标准输出~

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool Mysort(long long& a, long long& b) {
	return a > b;
}
int main()
{
	int n, m;
	cin >> n >> m;
	long long x;
	vector<long long>v;
	for (int i = 0; i < n; i++) {
		cin >> x;
		v.push_back(x);
	}
	sort(v.begin(), v.end(), Mysort);
	if (n < m)
		m = n;
	for (int i = 0; i < m; i++) {
		if (i != 0)
			cout << ' ';
		cout << v[i];
	}
	return 0;
}

PS:成功解题=理清思路+一定的技巧~