洛谷: P1589 泥泞路

思路: 一道比较明显的贪心题目。覆盖路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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值