P1250 种树 [贪心:区间选点问题]

1|0https://www.luogu.com.cn/problem/P1250



贪心,排序,差分约束
黄色题

2|0 


思路一:  区间选点问题
贪心,要种树种得少,就要使一棵树给多个区间使用,这样,尽量在重叠区间种树即可,而重叠位置一定是区间尾部。处理问题时,先按所有区间的结束位置从小到大排序,若结束位置相同,则按开始位置从大到小排序。之后依次处理每个区间,先在第一个区间尾部种满足要求的树,对下一个区间,看差多少棵就在该区间尾部种多少。

步骤:

①先按照b[]从小到大快排

②对每个区间依次处理

a.从前到后扫描这个区间,统计点的个数;

b.若没有超过要求的点数,则从该区间后向前扫描,添加覆盖点。

③输出ans

复制代码
#include<bits/stdc++.h> using namespace std; int n,h,k,flag[30005],ans; struct node{ int s,e,t; }a[30005]; bool cmp(node a,node b) { return a.e<b.e; //这里要注意按区间尾部从小到大排序,因为要保证两个区间尾部不重叠 } int main() { cin>>n>>h; for(int i=1; i<=h; i++) { cin>>a[i].s>>a[i].e>>a[i].t; } sort(a+1,a+h+1,cmp); for(int i=1; i<=h; i++) { k=0; for(int j=a[i].s; j<=a[i].e; j++) { if(flag[j]) { k++; } } if(k<a[i].t) { for(int j=a[i].e; j>=a[i].s; j--) { if(!flag[j]) { flag[j]=1; k++; ans++; if(k==a[i].t) { break; } } } } } cout<<ans; }
复制代码

思路二:差分约束


__EOF__

本文作者灰の魔女伊蕾娜
本文链接https://www.cnblogs.com/2elaina/p/16565839.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -イレイナ  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示