专栏文章

题解:P12380 [蓝桥杯 2023 省 Python B] 管道

P12380题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip86dba
此快照首次捕获于
2025/12/03 07:44
3 个月前
此快照最后确认于
2025/12/03 07:44
3 个月前
查看原文

简单思路

二分答案基础题,直接二分枚举最短的时间。
然后进行检验:直接让所有水龙头放水,看看是否满足淹没了整个管道。
如果满足,继续找更小的解;反之往大找可行解。

代码实现

注意检验部分有一处细节,当前水龙头的范围更大才更新最远点,要取新范围和历史最远的较大值。
CPP
#include<bits/stdc++.h>
#define N 100005
using namespace std;

class Quick_IO
{
  public:
	template<typename T>
	void read(T &r)
	{
		T x = 0, f = 1;
		char ch = getchar();
		while (ch < '0' || ch > '9')
		{
			if (ch == '-') f = -1;
			ch = getchar();
		}
		while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
		r = x * f;
	}
	template<typename T, typename... Args>
	void read(T &tmp, Args &... tmps)
	{
		read(tmp);
		read(tmps...);
	}
} io;

int n, len;
int l[N], s[N];

bool Judge(int aim)	//检验
{
	int far = 0;
	for (int i = 1, z, y; i <= n; i++)
	{
		if (aim < s[i]) continue;
		z = l[i] - (aim - s[i]);
		y = l[i] + (aim - s[i]);
		if (z - 1 <= far) far = max(y, far); //注意这里需要比较一下
	}
	return far >= len;
}

signed main()
{
	io.read(n, len);
	for (int i = 1; i <= n; i++) io.read(l[i], s[i]);

	int L = 1, R = 1e9, mid = 0, ans = 1e9;
	while (L <= R)	//二分答案
	{
		mid = L + (R - L) / 2;
		if (Judge(mid)) ans = mid, R = mid - 1;
		else L = mid + 1;
	}
	cout << ans;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...