CF1602F. Difficult Mountain


題意

給一座山 初始高度為 \(d\)
\(n\) 個人 每個人有屬性 \(a,s\)
表示他最高能爬上高度 \(d\) 小於等於 \(s\) 的山,他爬完山后,山的高度 \(d=max(a,d)\)
\(n \leq 5\times10^5\)

題解

其實是貪心。猜結論題。
一般思路是按照 \(a\)\(s\) 排序 然后進行貪心
對於這題 我們按照 \(max(a,s)\) 從小到大排序后,如果當前點能選擇就選,得出的數量即為答案。
首先,我們分情況討論。對於\(a\leq s\)的人,我們一定會選擇,因為選擇他不會對山的高度產生額外貢獻。對於\(a>s\)的人,我們能在不影響上面人的情況下選擇它。
對於\(max(a,s)\),它代表當前這個人爬完山后能達到的最大高度,我們把這個高度從小到大排序,就能保證山的高度遞增。然后對於 \(max(a,s)\) 相同的兩個點 比較他們的 \(s\) 優先選擇 \(s\) 更大的放在前面
如果當前點\(a\leq 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\n",res);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM