2022 11月洛谷传智杯模拟赛 平等的交易 First day

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

题目描述

你有 n 件道具可以买,其中第 i 件的价格为 ai。

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

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

输入格式

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

接下来一行 n 个正整数,表示 {an}。

接下来一行 1 个正整数,表示 w。

输出格式

一个正整数,表示答案。

【输入输出样例

样例输入

1 1 2
5

 样例输出 
2

 提示

【样例解释】

买价值为 2 的道具,并交换为两个价值为 1 的道具。

【数据范围及约束】

测试数据满足,1 <= n<=10^6,0 <= ai <= 10^9,1 <= w <=2*10^9。

思路:

题目中让我们尽可能的买价值最大的一件商品,然后用这件商品交换若干的商品并输出能交换的最大的数量。

把所有的道具写进数组里,然后给数组排序,判断输入的最大的价格是否大于手中的钱w,找到小于等于w的最大值,用最大值去交换其他商品,并输出最大件数。

AC代码:​​​​​​​

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1e6+10;
long long a[N];
int main()
{
	int n,max=0;
	long long w;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%lld",&a[i]);
	sort(a,a+n);
	scanf("%lld",&w);
	if(a[n-1]<=w) w=a[n-1];
	else
	{
		for(int i=0;i<n;i++)
		{
			if(a[i]>w)
			{
				w=a[i-1];
				break;
			 } 
		}
	}
	int d=0;
	long long sum=0;
	for(int i=0;i<n;i++)
	{
		sum+=a[i];
        d=i;
		if(sum>w)
		{
			break;
		}
	}
	printf("%d",d);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值