P1589 泥泞路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

思路

  • step 1:将泥泞小路针对起点排序。使用一个 结构体+自带sort 就可以实现。
  • step 2:得到起点有序的小路之外,就需要考虑怎么铺路了。该怎么铺呢?主要就是两种情况:  
  • 情况1:每次恰好只铺了自己的路。而且也刚刚好铺完,这样就不会导致与后面的铺路重复。比如“1 3”起点是1,终点是3,这样用一个长度为3的木板,一次就可以铺好。同理,“1 6”就只需要完整的2块木板。
    情况2:世界不可能如此完美,那么遇到不能整铺的情况怎么办?例如:“1 4”用长度为3的模板就需要两块。(1-3用一块,3-4再用一块。但是很显然,3-4这块木板是多余了2米。)我们就需要考虑如何最优化这种铺法多余的木板。很简单,贪就是了!如果当前铺的终点的比下次要铺的起点要远,那么我们就用这次的终点接着铺,而不是从下次的起点开始铺。无论如何,这样都能保证铺路木板最少化(因为更短的路需要更少的木板。)例如,有两段路都需要铺,分别是“3-7,8-12”(使用长度为3的木板),可以看到(3-6-9-12)只需要3块木板,如果是分开铺(3-6-7,8-11-12),则需要4块木板
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int n,l,s[10005],e[10005],i,h,d;
int main()
{
    cin>>n>>l;
    for(i=1;i<=n;i++)
    cin>>s[i]>>e[i];
    sort(s+1,s+1+n); sort(e+1,e+1+n);
    d=s[1];

    for(i=1;i<=n;i++)
    {
        while(d<e[i])
        {
            d+=l;
            h++;
        }
        d=max(d,s[i+1]);//比较当前终点和下一个起点,选大的,避免重复,执行情况2;
    }
    cout<<h;
    return 0;
}

 

posted on 2022-08-25 08:34  ljq0120  阅读(36)  评论(0编辑  收藏  举报