洛谷P2877 [USACO07NOV]防晒霜Sunscreen

题目
此题有多种贪心方法。
首先简化题意:
有几个在数轴上的区间,和几个在数轴上确定的位置的点,问用这些数目的点,最多能满足多少个区间里有点。
注意:此题跟区间选点问题不一样,每个点只能满足一个区间,而区间选点则可以满足多个区间。
进行贪心分析:
我们首先考虑区间,首先把最难满足的放在前面,可以把l从大到小排序,也可以把r从小到大排序。
再次注意:此时满足的困难程度并不是取决于所有点,而是根据一个点来确定区间的难易。
因为对于一个点,如果l小的区间不满足,l比它大的区间肯定不会满足,所以l大的比较困难,如果不让他先选,很有可能靠右的点被一个l小的区间给占了,r同理。
将当前问题中难解决的环节先解决往往是正确的贪心策略。
然后考虑如何选择点呢。点的选择需要根据区间的排序方式选择。
比如l是从大到小排序的,那越往后区间的l越左。所以越左边的点越需要放在后面和放在后面的区间匹配,因此点也是从大到小排序。

#include <bits/stdc++.h>
using namespace std;
int c, l, ans;
struct ha {
	int r, l;
}data[100010];
struct shuang {
	int zhi, tot;
}a[100100];
bool cmp1(ha x, ha y)
{
	return x.l > y.l;
}
bool cmp2(shuang x, shuang y)
{
	return x.zhi > y.zhi;
}
signed main()
{
	scanf("%d%d", &c, &l);
	for (int i = 1; i <= c; i++)
		scanf("%d%d", &data[i].l, &data[i].r);
	for (int i = 1; i <= l; i++)
		scanf("%d%d", &a[i].zhi, &a[i].tot);
	sort(a + 1, a + 1 + l, cmp2);
	sort(data + 1, data + 1 + c, cmp1);
	for (int i = 1; i <= c; i++)
		for (int j = 1; j <= l; j++)
			if (a[j].zhi >= data[i].l && a[j].zhi <= data[i].r && a[j].tot)
			{
				a[j].tot--, ans++;
				break;
			}
	printf("%d", ans);
}
原文地址:https://www.cnblogs.com/liuwenyao/p/11776912.html