#include <iostream>
#include<algorithm>
#include<cmath>
const int N=1e5+9;
int a[N];
using namespace std;
int main()
{
int n,k;cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
int sum=0;
int nums=0;
for(int i=1;i<=n;i++)
{
if(k>=a[i])
{
nums++;
k=k-a[i];
}
else if(k<a[i]&&k>ceil(a[i]/2))
{
nums++;
k=k-a[i];
}
else break;
}
cout<<nums<<endl;
return 0;
return 0;
}
这段代码确实是一道关于贪心算法的题目。它描述了一个场景,其中有 � 个物品,每个物品都有各自的价值存储在数组 a
中。现在有一个总共拥有 � 单位资源可以用来“购买”这些物品,目标是最大化购买的物品数量。代码使用了 C++ 语言来实现。
以下是对代码行为的逐步分析:
- 定义大小为10e5+9的整型数组
a
。 - 使用命名空间
std
,避免每次调用标准库函数时需要前缀std::
。 - 在
main()
函数定义两个整型变量n
和k
。 - 通过循环读入 � 个物品的价值,并存储到数组
a
中。 - 使用内置函数
sort
来按升序排列数组中元素(从 a[1] 到 a[n])。 - 定义和初始化两个变量:累计消耗资源量
sum
和已购买物品数量nums
。 - 循环迭代所有物品以决定是否能够购买当前物品:
- 如果当前剩余资源量 � 大于或等于当前轮询到的物品价值,更新能够购买的商品数并从可用资源中扣除该商品价格。
- 如果剩余资源不足以全额购买当前商品,但超过该商品价格的一半(向上取整),则仍然增加能购买的商品数并扣除当前商品价格。(可能表示实际使用情境中允许部分支付)
- 否则一旦无法继续购买,则退出循环。
- 最后打印出可以购买的最大数量。