洛谷 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 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/10982143.html