题目描述

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

输入

第1行输入三个整数C,H,B,B是出口的位置.之后C行每行输入两个整数,分别表示一个老师所在的教室和他的下课时间.

输出

贝茜最早能够到达出口的时间.

样例输入

4 10 3
8 9
4 21
3 16
8 12

样例输出

22


题解

区间dp

考试题。。。考挂了。。。

(以下内容复制自题解)

考虑 dp[i][j][0/1]表示已经处理了从左数的 i 个和从右数的 j 个的案件,当前在 i 还是在 j
dp[i][j][0]可以由 dp[i-1][j][0],dp[i][j+1][1]+dis 来转移
dp[i][j][1]同理。

(以上内容复制自题解)

个人想法:

首先一定是先处理区间端点。一个大概思路是:对于非必选的点能不选就不选,而区间端点必选,其余点不必选,因此只需要考虑区间端点。

(或者一个更好的思考方法是:考虑把这个过程反过来,变为从$B$开始走,每个点必须在$ANS-T_i$时间内到达,最终要求到达0位置。显然经过的点一定不会傻到不选,因此反过程先选中间再选端点,正过程就是先选端点再选中间。
PS:$ANS$满足单调性,因此CQzhangyu就这样切了此题。。)

然后设$f[i][j][0/1]$表示左端点为$i$,右端点为$j$,当前处理完$i/j$的最小时间。直接转移即可。注意一下这是一个半开半闭区间的状态,因此初始状态需要计算,最终答案直接用$f[i][i][0/1]$统计。

时间复杂度$O(n^2)$

代码简单的不行= =

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010
using namespace std;
struct data
{
int p , t;
bool operator<(const data &a)const {return p < a.p;}
}a[N];
int f[N][N][2];
int main()
{
int n , m , i , j , k , ans = 1 << 30;
scanf("%d%*d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &a[i].p , &a[i].t);
sort(a + 1 , a + n + 1);
memset(f , 0x3f , sizeof(f));
f[1][n][0] = max(a[1].p , a[1].t) , f[1][n][1] = max(a[n].p , a[n].t);
for(k = n - 1 ; k ; k -- )
{
for(i = 1 ; i <= n - k + 1 ; i ++ )
{
j = i + k - 1;
if(i > 1) f[i][j][0] = min(f[i][j][0] , f[i - 1][j][0] + a[i].p - a[i - 1].p) , f[i][j][1] = min(f[i][j][1] , f[i - 1][j][0] + a[j].p - a[i - 1].p);
if(j < n) f[i][j][0] = min(f[i][j][0] , f[i][j + 1][1] + a[j + 1].p - a[i].p) , f[i][j][1] = min(f[i][j][1] , f[i][j + 1][1] + a[j + 1].p - a[j].p);
f[i][j][0] = max(f[i][j][0] , a[i].t) , f[i][j][1] = max(f[i][j][1] , a[j].t);
}
}
for(i = 1 ; i <= n ; i ++ ) ans = min(ans , min(f[i][i][0] , f[i][i][1]) + abs(a[i].p - m));
printf("%d\n" , ans);
return 0;
}

【bzoj3379】[Usaco2004 Open]Turning in Homework 交作业 区间dp的更多相关文章

  1. 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP

    [BZOJ3379][Usaco2004 Open]Turning in Homework 交作业 Description     贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶 ...

  2. BZOJ 3379: [Usaco2004 Open]Turning in Homework 交作业

    Description     贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶牛同学回家. 每门科目的老师所在的教室排列在一条长为H(1≤H≤1000)的走廊上,他们只在课后接收 ...

  3. 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业

    题解: 比较容易想到二分答案+时间逆流 这样就变成了经典的路灯问题 f[a][b][0/1] 其实可以不用二分答案 根据倒着考虑我们会发现一定是先走旁边的再走中间的 计算到当前点+下课时间所需的最小时 ...

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

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

  5. [BZOJ3379] Turning in Homework

    中文题目:提交作业 原文题目:Turning in Homework 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3379 哎,今天竟然没有 ...

  6. bzoj 3379 - [USACO2004] 交作业

    Description 一个数轴上有 \(n \le 1000\) 个位置, 每个位置有一个时间 \(t_i\) 要求在 时刻 \(t_i\) 后, 至少经过该位置一次. (去交作业) 求从 \(0\ ...

  7. POJ 1991 Turning in Homework(区间DP)

    题目链接 Turning in Homework 考虑区间DP $f[i][j][0]$为只考虑区间$[i, j]$且最后在$a[i]$位置交作业的答案. $f[i][j][1]$为只考虑区间$[i, ...

  8. python学习笔记(二)python基础知识(交作业)

    交作业 #!/usr/bin/env python # coding: utf-8 # # 1. 每个用户购买了多少不同种类的产品 # filename = 'train.txt' import sy ...

  9. ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息

    在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提 ...

随机推荐

  1. GUI小程序---理解GUI

    package com.gui; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent ...

  2. vue服务端渲染浏览器端缓存(keep-alive)

    在使用服务器端渲染时,除了服务端的接口缓存.页面缓存.组建缓存等,浏览器端也避免不了要使用缓存,减少页面的重绘. 这时候我们就会想到vue的keep-alive,接下来我们说一下keep-alive的 ...

  3. vue服务端渲染按需引入mint

    vue服务器渲染按需引入mint-ui 1.修改.babelrc文件,在.babelrc文件中plugins数组中添加 { "presets": [["es2015&qu ...

  4. C# 用HttpWebRequest模拟一个虚假的IP伪造ip

    有人会说:IP验证是在TCP层完成的,不是HTTP层完成的,如果伪造IP的话可能连TCP的三次握手都完不成.我这里说的不是完全意义的伪造.如果你使用透明代理上网,那么在透明代理发送给服务器端的HTTP ...

  5. php导出excel长数字串显示为科学计数方法与最终解决方法

    1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel-> ...

  6. ctf题目writeup(8)

    2019.2.11 南京邮电的ctf平台: 地址http://ctf.nuptzj.cn/challenges# 他们好像搭新的平台了...我注册弄了好半天... 1. 签到题,打开网址: 查看一下页 ...

  7. 50条大牛C++编程开发学习建议

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  8. docker学习(三) 安装docker的web可视化管理工具

    1.docker是一个一款很轻便的应用容器引擎,为了更好的管理和使用docker,使用web可视化管理工具似乎更符合大多数人的需求.在这里,我给大家分享下自己使用过的几款web工具:docker UI ...

  9. C#的委托Delegate

    一.委托基础 1.什么是委托 委托(Delegate) 是存有对某个方法的引用的一种引用类型变量,用关键字delegate申明,实现相同返回值和参数的函数的动态调用,提供了对方法的抽象. 委托(Del ...

  10. 也谈js传值和传址

    通常的认识就是基本的数值元素是传值,对象等复杂结构传址,无需争论,一试便知. 首先是数值 var a = 1 var b = a a = 2 console.log(a) console.log(b) ...