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;
}
还是菜。