T292113 [传智杯 #5 练习赛] 平等的交易

85 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

[传智杯 #5 练习赛] 平等的交易

题目描述

你有 nn 道具可以买,其中第 ii 的价格为 aia_i

你有 ww 元钱。你仅能用钱购买其中的一件商道具。当然,你可以拿你手中的道具换取其他的道具,只是这些商道具的价值之和,不能超过你打算交换出去的道具。你可以交换无数多次道具。道具的价值可能是 00,但是你不能使用空集换取价值为 0 的商品。

请问,在这个条件下,最多可以换取多少件道具?

输入格式

第一行一个正整数 nn,表示道具个数。

接下来一行 nn 个正整数,表示 {an}\{a_n\}

接下来一行 11 个正整数,表示 ww

输出格式

一个正整数,表示答案。

样例 #1

样例输入 #1

3 
1 1 2
5

样例输出 #1

2

提示

【样例解释】

买价值为 22 的道具,并交换为两个价值为 11 的道具。

【数据范围及约束】

测试数据满足,1n1061 \leq n\leq10^60ai1090 \leq a_i\leq 10^91w2×1091 \leq w\leq2\times10^{9}

思路分析:

  • 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:贪心+数学+模拟,属于简单题~