LG8837

题目传送门

分析

既然要使得购买到商品的人最多,很容易想到要用贪心的策略。对于拥有的钱越少的人,就应当给 ta 匹配越便宜的商品。可以证明这种方案能使人数最大化。

接下来看具体的方法。首先将 \(w_i\)\(c_i\) 从小到大排序(\(w_i\)\(c_i\) 的含义如题目中所述),接着,将 \(w_1\)\(c_1\) 比较,看是否能买下,如果能买则买,不能买则将 \(c_1\) 推给下一个人。以此类推,直到最后一个人比较结束。

这样做的思想是将便宜的给钱少的人,如果买不起则给后面的人,就是“少钱买低价,多钱买高价”,可以保证最多的人买到东西。

Code

具体代码实现如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,w[1000001],c[1000001],ans,k;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		w[i]=read();
	for(int i=1;i<=m;i++)
		c[i]=read();
	sort(w+1,w+n+1);
	sort(c+1,c+m+1);
	k=1;//k 代表当前最便宜的商品的位置(排序后)
	for(int i=1;i<=n;i++)
		if(w[i]>=c[k])
			ans++,k++;
	cout<<ans;
	return 0;
}
posted @ 2024-01-20 17:46  liyilang2021  阅读(3)  评论(0编辑  收藏  举报