开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
[传智杯 #5 练习赛] 平等的交易
题目描述
你有 件道具可以买,其中第 件的价格为 。
你有 元钱。你仅能用钱购买其中的一件商道具。当然,你可以拿你手中的道具换取其他的道具,只是这些商道具的价值之和,不能超过你打算交换出去的道具。你可以交换无数多次道具。道具的价值可能是 ,但是你不能使用空集换取价值为 0 的商品。
请问,在这个条件下,最多可以换取多少件道具?
输入格式
第一行一个正整数 ,表示道具个数。
接下来一行 个正整数,表示 。
接下来一行 个正整数,表示 。
输出格式
一个正整数,表示答案。
样例 #1
样例输入 #1
3
1 1 2
5
样例输出 #1
2
提示
【样例解释】
买价值为 的道具,并交换为两个价值为 的道具。
【数据范围及约束】
测试数据满足,,,。
思路分析:
- 1.这题初看我以为是背包问题,我吓了一跳,第三题就背包算法了,传智杯这么难吗
- 2.然后我细看发现,这不就是一个贪心的思路的一个模拟题吗
- 3.首先,我们需要先进行一次排序,将所有的物品从小到达排序一次
- 4.我们要找到我们的钱可以买到的最贵的一个物品
- 5.从数组的头开始进行遍历,如果价格比当前记录的价格小的话,当前价格减去次物品的价格,然后再循环遍历
- 6.输出
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int>v;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
v.push_back(x);
}
int w;
cin >> w;
sort(v.begin(), v.end());
int count = 0, value = 0;
for (int i = v.size() - 1; i >= 0; i--) {
if (w >= v[i]) {
value = v[i];
break;
}
}
int i = 0;
while (true) {
if (value >= v[i]) {
value -= v[i];
count++;
}
else
break;
i++;
}
cout << count;
return 0;
}
PS:贪心+数学+模拟,属于简单题~