[传智杯 #5 练习赛] 平等的交易
题目描述
你有 n 件道具可以买,其中第 i 件的价格为 ai。
你有 w 元钱。你仅能用钱购买其中的一件商道具。当然,你可以拿你手中的道具换取其他的道具,只是这些商道具的价值之和,不能超过你打算交换出去的道具。你可以交换无数多次道具。道具的价值可能是 0,但是你不能使用空集换取价值为 0 的商品。
请问,在这个条件下,最多可以换取多少件道具?
输入格式
第一行一个正整数 n,表示道具个数。
接下来一行 n 个正整数,表示 {an}。
接下来一行 1 个正整数,表示 w。
输出格式
一个正整数,表示答案。
【输入输出样例】
样例输入
3
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);
}