题目链接
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 }