Description

贝西在哞哞大学选修了C门课,她要把这些课的作业交给老师,然后去车站和同学们一 起回家。老师们在办公室里,办公室要等他们下课后才开,第i门课的办公室在Ti时刻后开放。

所有的办公室都在一条走廊上,这条走廊长H米,一开始贝西在走廊的最西边,第i门课 的办公室距离贝西的长度为Xi,车站距离贝西的长度为B。

贝西可在走廊上自由行走,每时刻可以向东或者向西移动一单位的距离,也可以选择在 任何地方暂停。贝西如果走到办公室所处的位置,而且这间办公室已经开门了的话,就可以 把作业交掉,不用花时间在走进办公室上。

请帮助贝西确定交完所有作业,再走到车站的最短时间。

Input Format

第一行:三个整数C,H和B,1 ≤ C ≤ 1000,1 ≤ H ≤ 1000,0 ≤ B ≤ H

第二行到C + 1行:每行两个整数,表示Xi和Ti,0 ≤ Xi ≤ H,0 ≤ Ti ≤ 10000

Output Format

第一行:单个整数,表示贝西交完作业后走到车站的最短时间

Sample Input

4 10 3

8 9

4 21

3 16

8 12

Sample Output

22

Solution

很容易想到用f[i][j][0/1]表示完成区间i到j且终点是i/j的最短时间(最后再去车站),但是仔细一想会发现这样的状态表示答案有局限性,

最后就只能从点1或点n去车站,而可能在中间存在一个点到有更优解。

那怎么办呢,不妨反过来想,让f[i][j][0/1]表示除了区间i到j都完成的最短时间,那么最后答案

就是min{min(f[k][k][0],f[k][k][1])+fabs(Xi-B)},(1<=k<=n)

预先将所有点按位置升序排序,

Code

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define N 1010
using namespace std; struct info {
int x, t;
} a[N];
int c, h, b, f[N][N][2]; inline int read() {
int 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();}
return x * f;
} bool cmp(info a, info b) {
return a.x < b.x;
} int main() {
freopen("in.txt", "r", stdin);
c = read(), h = read(), b = read();
for (int i = 1; i <= c; ++i) {
a[i].x = read();
a[i].t = read();
}
sort(a + 1, a + c + 1, cmp);
memset(f, 0x3f, sizeof(f));
f[1][c][0] = max(a[1].x, a[1].t), f[1][c][1] = max(a[c].x, a[c].t);
for (int i = 1; i <= c; ++i)
for (int j = c; j >= i; --j) {
int tmp = f[i][j][0];
tmp = min(tmp, max(f[i - 1][j][0] + a[i].x - a[i - 1].x, a[i].t));
tmp = min(tmp, max(f[i][j + 1][1] + a[j + 1].x - a[i].x, a[i].t));
f[i][j][0] = tmp; tmp = f[i][j][1];
tmp = min(tmp, max(f[i - 1][j][0] + a[j].x - a[i - 1].x, a[j].t));
tmp = min(tmp, max(f[i][j + 1][1] + a[j + 1].x - a[j].x, a[j].t));
f[i][j][1] = tmp;
}
int Ans = (int)1e9;
for (int i = 1; i <= c; ++i)
Ans = min(Ans, min(f[i][i][0], f[i][i][1]) + (int)fabs(a[i].x - b));
printf("%d\n", Ans);
return 0;
}

当常规方法行不通时,不妨逆向思考一下,动规也更要检验答案的准确性

USACO2004 Open提交作业(区间DP)的更多相关文章

  1. 【BZOJ3379】【USACO2004】交作业 区间DP

    题目描述 数轴上有\(n\)个点,你要从位置\(0\)去位置\(B\),你每秒钟可以移动\(1\)单位.还有\(m\)个限制,每个限制\((x,y)\)表示你要在第\(t\)秒之后(可以是第\(t\) ...

  2. 【bzoj3379】[Usaco2004 Open]Turning in Homework 交作业 区间dp

    题目描述 数轴上有C个点,每个点有一个坐标和一个访问时间,必须在这个时间后到达这个点才算访问完成.可以在某个位置停留.每在数轴上走一个单位长度消耗一个单位的时间,问:访问所有点并最终到B花费的最小时间 ...

  3. P2339 提交作业usaco(区间dp)

    P2339 提交作业usaco 题目背景 usaco 题目描述 贝西在哞哞大学选修了 C 门课,她要把所有作业分别交给每门课的老师,然后去车站和同学们一起回家.每个老师在各自的办公室里,办公室要等他们 ...

  4. 区间dp提升复习

    区间\(dp\)提升复习 不得不说这波题真的不简单... 技巧总结: 1.有时候转移可以利用背包累和 2.如果遇到类似区间添加限制的题可以直接把限制扔在区间上,每次只考虑\([l,r]\)被\([i, ...

  5. 第四届河南省ACM 节能 区间DP

    1001: 节 能 时间限制: 1 Sec  内存限制: 128 MB 提交: 21  解决: 9 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多 ...

  6. 山区建小学(区间DP)

    山区建小学 时间限制: 1 Sec  内存限制: 128 MB提交: 17  解决: 5[提交][状态][讨论版][命题人:quanxing] 题目描述 政府在某山区修建了一条道路,恰好穿越总共m个村 ...

  7. 「IOI1998」「LuoguP4342」Polygon(区间dp

    P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...

  8. 「LuoguP1220」 关路灯(区间dp

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  9. 「USACO16OPEN」「LuoguP3147」262144(区间dp

    P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though ...

随机推荐

  1. 201521123090《JAVA程序设计》第二周学习总结

    1. 本章学习总结 java基本数据类型 String类对象使用 枚举类型及switch分支 容器的概念 2. 书面作业 Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代 ...

  2. 201521123015 《JAVA程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业:本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  3. ORACLE PROC开发(转载)

    Proc也就是嵌入式C,与informix的ESQ/C有类似之处,本部分主要列出Proc与Esql的区别,相同部分请参见informix部分. 1.数组功能 Proc中支持使用宿主变量数组一次查询SE ...

  4. python之异常

    一.异常与错误 1.语法错误 错误一: if 错误二: def text: pass 错误三: print(sjds 2.逻辑错误 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num ...

  5. SSH复用代码最终版

    web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...

  6. Oracle游标详解大全

    本文出自: http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html -- 声明游标:CURSOR cursor_name IS sel ...

  7. 全方位解读"CPU load average"

    前一段时间,有同事因为“CPU负载到达5算不算高”的问题争论了一番,看似简单的一个问题表明了我们并没有真正理解服务器的CPU负载. 如果你的线上服务出现性能问题,那么检查机器的CPU负载情况是必不可少 ...

  8. (转)Unity3D 之插值计算

    在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间.两个向量之间.两个浮点数之间.两个颜色之间,其函数原型如下: Material.Lerp 插值 funct ...

  9. js转换字符串为数值的方法

    在js读取文本框或者其他表单数据的时候获得的值是字符串类型的,比如两个文本框a和b,假设获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,由于他们都是字符串形 ...

  10. 说下browserslist

    browserslist 是一个开源项目 见到有些package.json里会有如下的配置参数 "browserslist": [ "> 1%", &qu ...