86分求助(解法正确)
查看原帖
86分求助(解法正确)
54550
zhangyuanyang楼主2023/6/16 17:10

就是朴素的 dp 做法,但第 5 个测试点过不了,这题还不能下载数据。跟题解里的代码对拍过,也没有发现问题。

代码如下:

#include <iostream>
using namespace std;
void update(int l, int r, int from, int base, int& dpl, int& dpr) {
	if (from <= l) {
		dpl = min(dpl, r + r - l - from + base);
		dpr = min(dpr, r - from + base); 
	} else if (from >= r) {
		dpl = min(dpl, from - l + base);
		dpr = min(dpr, from + r - l - l + base);
	} else {
		dpl = min(dpl, r + r - l - from + base);
		dpr = min(dpr, from + r - l - l + base);
	}
}
int main() {
	int n;
	cin >> n;
	int l[n + 1], r[n + 1], dpl[n + 1], dpr[n + 1];
	l[0] = 1; r[0] = 1; dpl[0] = 0; dpr[0] = 0;
	const int MAXINT = 214748367;
	for (int i = 1; i <= n; i++) {
		cin >> l[i] >> r[i];
		dpl[i] = MAXINT; dpr[i] = MAXINT;  
	}
	for (int i = 1; i <= n; i++) {
		update(l[i], r[i], l[i - 1], dpl[i - 1], dpl[i], dpr[i]);
		update(l[i], r[i], r[i - 1], dpr[i - 1], dpl[i], dpr[i]);
	}
	cout << (min(dpl[n] + n - l[n], dpr[n] + n - r[n]) + n - 1);
}
2023/6/16 17:10
加载中...