USACO2004 Open提交作业(区间DP)
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)的更多相关文章
- 【BZOJ3379】【USACO2004】交作业 区间DP
题目描述 数轴上有\(n\)个点,你要从位置\(0\)去位置\(B\),你每秒钟可以移动\(1\)单位.还有\(m\)个限制,每个限制\((x,y)\)表示你要在第\(t\)秒之后(可以是第\(t\) ...
- 【bzoj3379】[Usaco2004 Open]Turning in Homework 交作业 区间dp
题目描述 数轴上有C个点,每个点有一个坐标和一个访问时间,必须在这个时间后到达这个点才算访问完成.可以在某个位置停留.每在数轴上走一个单位长度消耗一个单位的时间,问:访问所有点并最终到B花费的最小时间 ...
- P2339 提交作业usaco(区间dp)
P2339 提交作业usaco 题目背景 usaco 题目描述 贝西在哞哞大学选修了 C 门课,她要把所有作业分别交给每门课的老师,然后去车站和同学们一起回家.每个老师在各自的办公室里,办公室要等他们 ...
- 区间dp提升复习
区间\(dp\)提升复习 不得不说这波题真的不简单... 技巧总结: 1.有时候转移可以利用背包累和 2.如果遇到类似区间添加限制的题可以直接把限制扔在区间上,每次只考虑\([l,r]\)被\([i, ...
- 第四届河南省ACM 节能 区间DP
1001: 节 能 时间限制: 1 Sec 内存限制: 128 MB 提交: 21 解决: 9 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多 ...
- 山区建小学(区间DP)
山区建小学 时间限制: 1 Sec 内存限制: 128 MB提交: 17 解决: 5[提交][状态][讨论版][命题人:quanxing] 题目描述 政府在某山区修建了一条道路,恰好穿越总共m个村 ...
- 「IOI1998」「LuoguP4342」Polygon(区间dp
P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...
- 「LuoguP1220」 关路灯(区间dp
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 「USACO16OPEN」「LuoguP3147」262144(区间dp
P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though ...
随机推荐
- 201521123090《JAVA程序设计》第二周学习总结
1. 本章学习总结 java基本数据类型 String类对象使用 枚举类型及switch分支 容器的概念 2. 书面作业 Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代 ...
- 201521123015 《JAVA程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业:本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- ORACLE PROC开发(转载)
Proc也就是嵌入式C,与informix的ESQ/C有类似之处,本部分主要列出Proc与Esql的区别,相同部分请参见informix部分. 1.数组功能 Proc中支持使用宿主变量数组一次查询SE ...
- python之异常
一.异常与错误 1.语法错误 错误一: if 错误二: def text: pass 错误三: print(sjds 2.逻辑错误 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num ...
- SSH复用代码最终版
web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...
- Oracle游标详解大全
本文出自: http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html -- 声明游标:CURSOR cursor_name IS sel ...
- 全方位解读"CPU load average"
前一段时间,有同事因为“CPU负载到达5算不算高”的问题争论了一番,看似简单的一个问题表明了我们并没有真正理解服务器的CPU负载. 如果你的线上服务出现性能问题,那么检查机器的CPU负载情况是必不可少 ...
- (转)Unity3D 之插值计算
在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间.两个向量之间.两个浮点数之间.两个颜色之间,其函数原型如下: Material.Lerp 插值 funct ...
- js转换字符串为数值的方法
在js读取文本框或者其他表单数据的时候获得的值是字符串类型的,比如两个文本框a和b,假设获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,由于他们都是字符串形 ...
- 说下browserslist
browserslist 是一个开源项目 见到有些package.json里会有如下的配置参数 "browserslist": [ "> 1%", &qu ...