题目描述
暴雨过后,FJ的农场到镇上的公路上有一些泥泞路,他有若干块长度为L的木板可以铺在这些泥泞路上,问他至少需要多少块木板,才能把所有的泥泞路覆盖住。
输入输出格式
输入格式:
第一行为正整数n(≤10000)和L(≤10000),分别表示有多少段泥泞路和木板的长度;接下来n行,每一行两个整数s和e(s≤e≤10^9),表示每一段泥泞路的起点和终点。
输出格式:
仅一个正整数,表示木板数。
输入输出样例
输出样例#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 }