CF1602F. Difficult Mountain

题意

给一座山 初始高度为 (d)
(n) 个人 每个人有属性 (a,s)
表示他最高能爬上高度 (d) 小于等于 (s) 的山,他爬完山后,山的高度 (d=max(a,d))
(n leq 5 imes10^5)

题解

其实是贪心。猜结论题。
一般思路是按照 (a)(s) 排序 然后进行贪心
对于这题 我们按照 (max(a,s)) 从小到大排序后,如果当前点能选择就选,得出的数量即为答案。
首先,我们分情况讨论。对于(aleq s)的人,我们一定会选择,因为选择他不会对山的高度产生额外贡献。对于(a>s)的人,我们能在不影响上面人的情况下选择它。
对于(max(a,s)),它代表当前这个人爬完山后能达到的最大高度,我们把这个高度从小到大排序,就能保证山的高度递增。然后对于 (max(a,s)) 相同的两个点 比较他们的 (s) 优先选择 (s) 更大的放在前面
如果当前点(aleq s) 则它一定会被选到。否则我们比较一下山的当前高度和现在的 (s) 如果(s) 更大说明这个人爬山不会对后面产生影响,

然后猜结论题代码一般都特别短。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<bitset>
#include<set>
#define ll long long
using namespace std;
const int inf = 0x7fffffff;
int n,d;
#define maxn 1000009
struct node{
	int s,a;
}a[maxn];
int cmp2(node a,node b)
{
	if(max(a.a,a.s)==max(b.a,b.s))
	{
		return a.s<b.s;
	}
	return max(a.s,a.a)<max(b.a,b.s); 
}
int f[maxn],val[maxn],cnt=0;
signed main()
{
	scanf("%d%d",&n,&d);
	
	int res=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].s,&a[i].a);
	}
	sort(a+1,a+1+n,cmp2);
	for(int i=1;i<=n;i++)	
		if(d<=a[i].s)
			d=max(d,a[i].a),res++;
	printf("%d
",res);
	return 0;
}
原文地址:https://www.cnblogs.com/lzy-blog/p/15464699.html