洛谷 P1589 泥泞路 & 2019青岛市竞赛(贪心)

题目链接

https://www.luogu.org/problemnew/show/P1589

解题思路

用结构体存下每一段泥泞路的左端点和右端点,然后用sort根据左端点排序,采用贪心的思想,从左往右遇到未覆盖的点ans++,然后去覆盖l的长度,这时现在覆盖到的位置就是max(下一段区间的左端点,当前覆盖到的位置)。注意每一个泥泞路段是一个区间,例如【2,5】实际上就是三个单位长度,它具有四个端点,我们记录的是单位长度,所以while里面的是<而不是<=。

AC代码

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,l,ans;
 5 struct ee{
 6     int e,s;
 7 }a[10005];
 8 bool cmp(ee a,ee b){
 9     return a.s<b.s;
10 }
11 int main(){
12     cin>>n>>l;
13     for(int i=1;i<=n;i++) cin>>a[i].s>>a[i].e;
14     sort(a+1,a+n+1,cmp);
15     int d=a[1].s;
16     for(int i=1;i<=n;i++){
17         while(d<a[i].e){
18             d+=l;
19             ans++;
20         }
21         d=max(d,a[i+1].s);
22     }
23     cout<<ans;
24     return 0;
25 }
原文地址:https://www.cnblogs.com/yinyuqin/p/10987508.html