zoukankan      html  css  js  c++  java
  • 洛谷 P1589 泥泞路

    题目描述

    暴雨过后,FJ的农场到镇上的公路上有一些泥泞路,他有若干块长度为L的木板可以铺在这些泥泞路上,问他至少需要多少块木板,才能把所有的泥泞路覆盖住。

    输入输出格式

    输入格式:

    第一行为正整数n(≤10000)和L(≤10000),分别表示有多少段泥泞路和木板的长度;接下来n行,每一行两个整数s和e(s≤e≤10^9),表示每一段泥泞路的起点和终点。

    输出格式:

    仅一个正整数,表示木板数。

    输入输出样例

    输入样例#1: 
    3 3
    1 6
    13 17
    8 12
    输出样例#1: 
    5

    解题思路:

    一道模拟题,我们用结构体来存所有泥泞路段的左端点和右端点.先按左端点从小到大排序,从左到右处理,处理每一段泥泞路时,计算当前需多少木板,再向后处理区间重叠情况即可.

    AC代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 
     7 int n,l,ans;
     8 struct kkk {
     9     int s,e;
    10     bool vis;
    11 }e[100001];
    12 
    13 bool cmp(kkk a,kkk b) {
    14     return a.s < b.s;
    15 }
    16 
    17 int main() {
    18 //    freopen("cover.in","r",stdin);
    19 //    freopen("cover.out","w",stdout);
    20     scanf("%d%d",&n,&l);
    21     for(int i = 1;i <= n; i++) {
    22         scanf("%d%d",&e[i].s,&e[i].e);
    23         e[i].vis = 0;
    24     }
    25     sort(e+1,e+1+n,cmp);
    26     for(int i = 2;i <= n; i++) {
    27         if(e[i].s <= e[i-1].e) {
    28             e[i-1].vis = 1;
    29             e[i].s = e[i-1].s;
    30         }
    31     }
    32     for(int i = 1;i <= n; i++) {
    33         if(!e[i].vis) {
    34             int len = e[i].e - e[i].s;
    35             if(len % l == 0) {
    36                 ans += len / l;//计算当前区间需木板数 
    37                 int u = e[i].e - 1; //以下为处理重叠区间 
    38                 for(int j = i + 1;j <= n; j++) {
    39                     if(u < e[j].s) break;
    40                     if(u >= e[j].e) {
    41                         e[j].vis = 1;
    42                         continue;    
    43                     }
    44                     if(u >= e[j].s) e[j].s = u + 1;            
    45                 } 
    46         } 
    47         else {
    48                 ans += (len / l) + 1;
    49                 int u = e[i].s + (len / l + 1) * l - 1;
    50                 for(int j = i + 1;j <= n; j++) {
    51                     if(u < e[j].s) break;
    52                     if(u >= e[j].e) {
    53                         e[j].vis = 1;
    54                         continue;    
    55                     }
    56                     if(u >= e[j].s) e[j].s = u + 1;
    57                 }        
    58             }
    59         }
    60     }
    61     cout << ans;
    62     return 0;
    63 }
  • 相关阅读:
    不定方程(Exgcd)
    [模板]乘法逆元
    STL-Deque(双端队列)与单调队列的实现
    最优得分 score
    摆书 book
    [模板]树链剖分
    [模板]Splay
    NOIP2013 货车运输
    Java的类类型和类的动态加载
    Java:搜索特定后缀名的文件
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/10982143.html
Copyright © 2011-2022 走看看