携手创作,共同成长!这是我参与「掘金日新计划 · 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,那么是出现了什么问题呢?
我们仔细阅读的话会发现——如果富翁数目小于要输出的个数会怎么办?所有这题目的关键点就出现在这里!
如何解决:
我们只需要在要输出前判断一下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:成功解题=理清思路+一定的技巧~