贪心-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;
}


 

 

posted on 2013-10-12 22:30  you Richer  阅读(180)  评论(0编辑  收藏  举报