题解:洛谷P2339 [USACO04OPEN] Turning in Homework G

news/2024/10/3 18:44:58

题目链接:洛谷P2339 [USACO04OPEN] Turning in Homework G

首先我们考虑如何处理到达给定时间后才能交作业这一限制。其实在生活中,我们一般只会考虑什么时候交作业截止 (除了某些卷王),这样我们只用考虑如何在最大结束时间之前交作业,而不是在所有作业都没开始交之前考虑如何转悠(前者明显比后者简单),这样我们可以先二分答案贝茜交齐所有作业的总时间,再来判断能否在这时间内从原来的终点交齐作业并最终来到原来的起点。

现在考虑如何判断是否可以在给定条件下交齐所有作业。可以知道如果有三份要交的作业 \(A, B, C\),他们距离当前点的距离 \(x_A < x_B < x_C\),由图:

可得从起始点先到 \(A\) 再到 \(B\) 最后到 \(C\) 一定优于从 先从起点到 \(B\) 再到 \(A\) 最后到 \(C\),因此,如果贝茜要在这条走廊上来回交作业,那么她每次改变方向后所走的区间长度总小于上一次,而不是先走一个大区间,再走一个小区间,然后又走一个大区间。反过来,这就是一个从小区间推到大区间的过程,可以用区间 DP 做了。

考虑设 \(dp_{l, r, 0/1}\) 表示交完 \(l\)\(r\) 区间内的作业,最后停留在左端点 \(l\) 的最小时间为 \(dp_{l, r, 0}\),停留在右端点 \(r\) 的最小时间为 \(dp_{l, r, 1}\),下面分四种情况讨论:

  • 现在在某个区间的左端点,要往左继续交作业。

  • 现在在某个区间的右端点,要往左继续交作业。

  • 现在在某个区间的左端点,要往右继续交作业。

  • 现在在某个区间的右端点,要往右继续交作业。

每种情况只用考虑到达时交作业是否截止,如果没有截止就可以更新答案,因此 DP 方程为:

\[dp_{l, r, 0} = \begin{cases} dp_{l + 1, r, 0} + dis_{l + 1} - dis_l & & dp_{l + 1, r, 0} + dis_{l + 1} - dis_l \leq time_l\\ dp_{l + 1, r, 1} + dis_r - dis_l & & dp_{l + 1, r, 1} + dis_r - dis_l \leq time_l \end{cases} \]

\[dp_{l, r, 1} = \begin{cases} dp_{l, r - 1, 1} + dis_r - dis_{r - 1} & & dp_{l, r - 1, 1} + dis_r - dis_{r - 1} \leq time_r\\ dp_{l, r - 1, 0} + dis_r - dis_l & & dp_{l, r - 1, 0} + dis_r - dis_l \leq time_r \end{cases} \]

注意:

  1. 将时间倒序后,记得将交作业截止时间更新为总时间减去原先开始交作业的时间。

  2. 记得将出发点与结束点也存为一个办公室,方便统计答案。

完整代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 9;
struct Homework{int x, t;
} h[N];
bool cmp(Homework a, Homework b){if(a.x == b.x)return a.t < b.t;return a.x < b.x;
}
int C, H, B;
int tmp[N];
int dp[N][N][2];
bool chk(int tim){for(int i = 1; i <= C; i++){tmp[i] = tim - h[i].t;if(h[i].t > tim)return 0;}memset(dp, 0x3f, sizeof(dp));dp[B][B][0] = dp[B][B][1] = 0;for(int len = 2; len <= C; len++)for(int l = 1; l + len - 1 <= C; l++){int r = l + len - 1;if(dp[l + 1][r][0] + h[l + 1].x - h[l].x <= tmp[l])dp[l][r][0] = min(dp[l][r][0], dp[l + 1][r][0] + h[l + 1].x - h[l].x);if(dp[l + 1][r][1] + h[r].x - h[l].x <= tmp[l])dp[l][r][0] = min(dp[l][r][0], dp[l + 1][r][1] + h[r].x - h[l].x);if(dp[l][r - 1][1] + h[r].x - h[r - 1].x <= tmp[r])dp[l][r][1] = min(dp[l][r][1], dp[l][r - 1][1] + h[r].x - h[r - 1].x);if(dp[l][r - 1][0] + h[r].x - h[l].x <= tmp[r])dp[l][r][1] = min(dp[l][r][1], dp[l][r - 1][0] + h[r].x - h[l].x);}if(dp[1][C][0] != 0x3f3f3f3f)return 1;elsereturn 0;
}
int main(){scanf("%d%d%d", &C, &H, &B);for(int i = 1; i <= C; i++)scanf("%d%d", &h[i].x, &h[i].t);h[++C] = Homework{B, 0};++C;sort(h + 1, h + C + 1, cmp);for(int i = 1; i <= C; i++)if(h[i].x == B && h[i].t == 0){B = i;break;}int l = 1, r = N * N;while(l <= r){int mid = (l + r) >> 1;if(chk(mid))r = mid - 1;elsel = mid + 1;}printf("%d", r + 1);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

独立站如何批量查收录,教你独立站如何批量查收录的简单方法

独立站批量查收录是提升网站SEO效果的重要步骤。以下提供几种简单且实用的方法,帮助你高效地批量查询独立站的收录情况: 一、使用搜索引擎的Site指令结合自动化脚本 了解Site指令: 在搜索引擎(如谷歌)的搜索框中输入“site:域名”(替换为你的实际域名),执行搜索后,可以…

谷歌收录查询工具,告诉你谷歌收录查询工具使用指南

谷歌收录查询工具是网站管理员和SEO专家用于监控和管理网站在谷歌搜索结果中表现的重要工具。以下是一份详细的谷歌收录查询工具使用指南,旨在帮助你更好地了解和使用这些工具。 一、Google Search Console(谷歌搜索控制台) Google Search Console是谷歌官方提供的免费工具,…

『模拟赛』多校A层冲刺NOIP2024模拟赛01

『模拟赛记录』多校A层冲刺NOIP2024模拟赛01Rank 打得还可以总A. 构造字符串 签,但是挂了 40pts。 发现判条件只有相等和不相等,于是想到并查集维护连通块,将强制相同的两个位置的连通块合并,强制不同的先记下,最后统一判断。 重点在细节处理,合并连通块时要将位置靠后的…

虚拟机类加载机制

1. 类加载时机 一个类型(接口/类)从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,…

CSS display属性 inline-block flex grid

CSS display inline-block flex grid ======================================= CSS的display属性是一个核心属性,用于控制元素如何在页面布局中显示,包括其盒模型的行为。以下是display属性的一些常见值及其示例代码:1. block 说明:将元素变为块级元素,独占一行,可以…

[39] (多校联训) A层冲刺NOIP2024模拟赛01

你们不感觉最近机房网越来越慢了吗,现在下个 10M 的东西要用三分钟,而且期间访问不了网站 整个机房分 1000Mbps 的带宽为啥只能分这么一点, huge 拿我电脑挖矿了? 本来以为多校就是多校的,结果是真的多校,一百一十多个人在一块考 huge: 参加的都是咱们北方这几个强校 你说…

事故分享——关于Conda激活环境失败并报gbk相关错误

事情是今天打开了pwsh,突然发现conda的环境没了,启动时提示:UnicodeEncodeError: gbk codec cant encode character \xe5 in position 884: illegal multibyte sequence在网上搜索了许多相关的资料,一度怀疑是代理等问题。 进行过的尝试:清理conda缓存,更新conda版本,删…

【闲话】高一上运动会

“加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!心跳节拍弥梦离 “加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!活力四射超神龙女 代表…