【ybt金牌导航1-5-3】【luogu P5785】任务安排3 / 任务安排

这篇博客探讨了一个涉及任务调度的问题,其中任务可能有负的完成时间。原问题利用单调队列处理非负时间,但负时间引入了新的挑战。作者提出使用二分搜索来解决这个问题,以找到最小总费用的方案。代码示例展示了如何在C++中实现这个算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务安排3 / 任务安排

题目链接:ybt金牌导航1-5-3 / luogu P5785

题目大意

有一些任务,你可以把它分成连续的几段来完成。
对于每一段,要先让机器预热一个固定的时间,然后再完成。
下一段任务要在前面段的任务都完成了才可以开始热机。
这一批任务完成的时间都是他们之间的和,然后每个任务的费用是它完成的时刻乘它的费用系数。
让你找一种方案使得总费用最小,输出总费用。
(机器完成的时间可能会是负数)

思路

不会机器完成时间是非负数的先看这个:
——>点我跳转<——

接着我们来说说是时间有负数怎么搞。
那时间是负数有什么影响呢?当然就是这个式子中右边不再单调递增:
d p a − d p b f a − f b ≤ t i + S \dfrac{dp_a-dp_b}{f_a-f_b}\leq t_i+S fafbdpadpbti+S
前面因为它是单调递增,我们可以直接单调队列移除左边的点,然后确定下凸图中最优的点,那现在我们就无法通过这样得出了。

当然,我们不能直接枚举,那我们观察这个式子吧。
然后其实你会发现它完全可以用二分来做,然后你一看时间复杂度,可以,那就该成用二分求就完事了。

代码

#include<cstdio>
#include<cstring>
#define ll long long

using namespace std;

ll n, s, t[300001], f[300001];
ll st[300001], sf[300001], best, l, r;
ll dp[300001], q[300001], x[300001], y[300001];

int get_best(int i) {
	int lef = 1, rig = r, re = 1;
	while (lef <= rig) {
		int mid = (lef + rig) >> 1;
		if (y[q[mid + 1]] - y[q[mid]] <= (st[i] + s) * (x[q[mid + 1]] - x[q[mid]])) {
			lef = mid + 1;
		}
		else rig = mid - 1, re = mid;
	}
	return re;
}

int main() {
	scanf("%lld %lld", &n, &s);
	for (ll i = 1; i <= n; i++) {
		scanf("%lld %lld", &t[i], &f[i]);
		st[i] = st[i - 1] + t[i];
		sf[i] = sf[i - 1] + f[i];
	}
	
	memset(dp, 0x7f, sizeof(dp));
	dp[0] = 0;
	l = 1;
	r = 1;
	for (ll i = 1; i <= n; i++) {
//		while (l < r && y[q[l + 1]] - y[q[l]] <= (st[i] + s) * (x[q[l + 1]] - x[q[l]])) l++;
		best = get_best(i);//改用二分
		dp[i] = dp[q[best]] + sf[i] * st[i] + s * sf[n] - st[i] * sf[q[best]] - s * sf[q[best]];
		x[i] = sf[i];
		y[i] = dp[i];
		while (l < r && (y[i] - y[q[r]]) * (x[q[r]] - x[q[r - 1]]) <= (y[q[r]] - y[q[r - 1]]) * (x[i] - x[q[r]])) r--;
		q[++r] = i;
	}
	
	printf("%lld", dp[n]);
	
	return 0;
}
<think>我们正在讨论如何卸载挂载点。用户提到挂载点是 `/run/media/ybt/CentOS 7 x86_64`,注意路径中有空格,因此需要特别处理。 卸载挂载点通常使用 `umount` 命令(注意不是unmount,而是umount)。由于路径包含空格,我们需要用引号将路径括起来,或者使用反斜杠转义空格。 有两种方法: 1. 使用双引号:`sudo umount "/run/media/ybt/CentOS 7 x86_64"` 2. 或者使用反斜杠转义空格:`sudo umount /run/media/ybt/CentOS\ 7\ x86_64` 注意:通常需要管理员权限,所以使用 `sudo`。 如果遇到设备忙(device is busy)的错误,可能是因为有进程正在使用挂载点内的文件。我们可以尝试以下方法: - 关闭所有使用该挂载点的程序。 - 使用 `lsof` 命令查看哪些进程在使用:`lsof "/run/media/ybt/CentOS 7 x86_64"`,然后结束相关进程。 - 如果不想手动结束进程,也可以使用 `umount` 的懒卸载(lazy unmount)选项:`sudo umount -l "/run/media/ybt/CentOS 7 x86_64"`,这样会先断开挂载,等设备不再繁忙时再清理资源。 另外,如果该挂载点是通过文件管理器自动挂载的(比如插入U盘或光盘),那么也可以尝试在文件管理器中右键点击该设备并选择“弹出”(Eject)来卸载。 但是,请注意,卸载(umount)和弹出(eject)是两个不同的操作。对于光盘设备,弹出操作除了卸载还会弹出光驱托盘,但对于U盘或移动硬盘,通常卸载和弹出效果类似。不过,在命令行中我们通常使用 `umount`。 步骤总结: 1. 尝试使用 `sudo umount` 命令卸载。 2. 如果设备忙,使用 `lsof` 查看并结束进程,或者使用懒卸载。 3. 卸载成功后,挂载点目录将变为空,可以安全移除设备。 注意:卸载后,该挂载点目录(`/run/media/ybt/CentOS 7 x86_64`)仍然存在,但里面不再有挂载的文件系统。这是正常的,因为该目录是系统临时创建的挂载点,通常由自动挂载服务(如udisks2)管理,在卸载后可以不用管它,下次挂载时可能会重新使用或自动删除。 因此,我们可以这样操作: 方法一(推荐): ``` sudo umount "/run/media/ybt/CentOS 7 x86_64" ``` 方法二(如果设备忙): ``` sudo umount -l "/run/media/ybt/CentOS 7 x86_64" ``` 如果上述命令仍然无法卸载,可以尝试查看设备是否被锁定,或者重启计算机(不推荐,应作为最后手段)。 另外,如果这个挂载点是通过图形界面挂载的,也可以尝试在图形界面中卸载(例如在文件管理器中右键点击该设备并选择“弹出”)。 最后,请注意:卸载操作不会删除设备上的数据,只是断开文件系统与目录的关联。 根据用户提供的引用,我们并没有直接关于卸载命令的内容,但我们可以根据Linux系统管理知识回答。 生成相关问题: 1. 如何查看当前系统中所有的挂载点? 2. 如果卸载时遇到“device is busy”错误,有哪些解决方法? 3. 如何永久性地避免某个设备被自动挂载? 4. 在Linux中,挂载和卸载文件系统的基本原理是什么?</think>### 如何卸载 `/run/media/ybt/CentOS 7 x86_64` 挂载点 #### 步骤详解: 1. **确认挂载点** 使用 `df -h` 或 `mount | grep CentOS` 命令确认挂载点的设备路径(如 `/dev/sdb1`),确保卸载目标正确: ```bash df -h | grep "CentOS 7 x86_64" ``` 2. **卸载挂载点** 由于路径包含空格,需用引号包裹路径或使用转义符: ```bash sudo umount "/run/media/ybt/CentOS 7 x86_64" # 推荐方式 # 或 sudo umount /run/media/ybt/CentOS\ 7\ x86_64 # 转义空格 ``` 3. **处理设备繁忙问题** 若提示 `target is busy`: - **查找占用进程**: ```bash sudo lsof +D "/run/media/ybt/CentOS 7 x86_64" ``` 结束相关进程(如 `kill -9 PID`)或关闭访问文件的程序。 - **强制卸载**(慎用): ```bash sudo umount -l "/run/media/ybt/CentOS 7 x86_64" # -l 表示延迟卸载 ``` 4. **验证卸载结果** 再次运行 `df -h` 确认挂载点已消失: ```bash df -h | grep "CentOS 7 x86_64" # 若无输出则表示成功 ``` #### 关键说明: - **权限要求**:必须使用 `sudo` 获取管理员权限。 - **路径空格处理**:Linux 将空格视为分隔符,必须用引号或 `\` 转义。 - **安全卸载**:卸载仅解除目录与设备的关联,**不会删除原始数据**。 - **自动挂载**:该路径由系统自动创建(如插入U盘时),卸载后目录可能保留为空文件夹,可安全忽略[^1]。 #### 示例命令流程: ```bash $ df -h | grep CentOS /dev/sdc1 15G 0% /run/media/ybt/CentOS 7 x86_64 $ sudo umount "/run/media/ybt/CentOS 7 x86_64" $ df -h | grep CentOS # 无输出即成功 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值