zoukankan      html  css  js  c++  java
  • 贪心-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
    ",ans);
        }
       return 0;
    }
    


  • 相关阅读:
    Codeforces Round #744 (Div. 3) (CF1579) 题解
    Codeforces Round #748 (Div. 3) (CF1593)题解
    NOIP2018初赛游记
    模板:高精度
    博客园,初见安~~
    20200211学习
    nyoj 1103 区域赛系列一多边形划分
    南阳oj 845 无主之地1
    hdu 2080 夹角有多大II
    hdu 分拆素数和
  • 原文地址:https://www.cnblogs.com/riskyer/p/3366086.html
Copyright © 2011-2022 走看看