贪心-poj-2437-Muddy roads

题目链接:

http://poj.org/problem?id=2437

题目意思:

给n个区间,每次可以用长度为L的棒A去覆盖,求将所有区间覆盖至少需要几次。给的区间不覆盖。

解题思路:

简单贪心。

先将区间按从大到小排序,然后依次放棒A,如果A在该区间有多的,且覆盖到了后面一个区间,则下一个区间可以该棒后面一位置开始覆盖。

代码:

 

#include<iostream>

#include<cmath>

#include<cstdio>

#include<sstream>

#include<cstdlib>

#include<string>

#include<cstring>

#include<algorithm>

#include<vector>

#include<map>

#include<set>

#include<stack>

#include<list>

#include<queue>

#include<ctime>

#include<bitset>

#define eps 1e-6

#define INF 0x3f3f3f3f

#define PI acos(-1.0)

#define ll __int64

#define LL long long

#define lson l,m,(rt<<1)

#define rson m+1,r,(rt<<1)|1

#define M 1000000007

#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;



#define Maxn 110000



struct Inte

{

    ll s,e;

}inte[Maxn];

int n,l;



bool cmp(struct Inte a,struct Inte b)

{

    return a.s<b.s;

}



int main()

{

    ll la;



    while(~scanf("%I64d%I64d",&n,&l))

    {

        for(int i=1;i<=n;i++)

            scanf("%I64d%I64d",&inte[i].s,&inte[i].e);



        sort(inte+1,inte+n+1,cmp); //将区间从小到大排序

        la=-1;

        ll ans=0,len,num;



        for(int i=1;i<=n;i++)

        {

            if(inte[i].e<=la) //如果上一个棒将这个区间完全覆盖了,则不需要继续添加棒了

                continue;



            if(inte[i].s<la) //如果占据了该区间一部分

            {

                len=inte[i].e-la; //剩下的长度

                num=(len+(l-1))/l; //所需要的棒的个数,注意向上取整

                ans+=num; //

                la+=num*l; //新的棒的覆盖位置

            }

            else

            {

                len=inte[i].e-inte[i].s; //上一个棒 没有延伸到该区间

                num=(len+(l-1))/l; //棒的个数

                ans+=num;

                la=inte[i].s+num*l; //新的棒的覆盖位置

            }

        }

        printf("%I64d\n",ans);

    }

   return 0;

}


 

 

你可能感兴趣的:(poj)