思路: 一道比较明显的贪心题目。覆盖路A的木板可能也会覆盖路B的部分长度,那在计算路B所需要的木板数量的时候,就不需要从起点开始铺。
由此类推,在每次循环的时候,我们需要知道覆盖路A木板在右端延伸到的位置(变量rl),在下一次循环的时候,找到开始铺木板的起点..。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
struct node {
int start, end;
}s[maxn];
bool cmp(node n1,node n2) {
return n1.start < n2.start;
}
int main() {
int n, l;
cin >> n >> l;
for (int i = 0; i < n; i++) {
cin >> s[i].start >> s[i].end;
}
sort(s, s + n, cmp);
int rl = 0, bk = 0, cnt = 0;
for (int i = 0; i < n; i++) {
int left = max(rl, s[i].start);//左边从哪里开始的
if (left >= s[i].end) {//这块已经被覆盖了,不需要木板
continue;
}
int need = (s[i].end - left);//需要多少米
int bk = ceil(1.0 * need / l);//需要的木板数量
cnt += bk;
int rest = bk * l - (s[i].end - left);//木板多出来多少米
rl = s[i].end + rest;
}
cout << cnt << endl;
return 0;
}