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

Description

贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶牛同学回家.

每门科目的老师所在的教室排列在一条长为H(1≤H≤1000)的走廊上,他们只在课后接收作业.交作业不需要时间.贝茜现在在位置0,她会告诉你每个教室所在的位置,以及走廊出口的位置.她每走1个单位的路程,就要用1秒.她希望你计算最快多久以后她能交完作业并到达出口.

Input

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

Output

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

Sample Input

4 10 3

8 9

4 21

3 16

8 12

Sample Output

22

解法:一个经典的DP。令dp[i][j][0/1] 表示除了i~j这段区间没完成其他的都完成了,然后现在要完成i(0)或j(1)的最短时间。这样子就是从一个大区间F[1][n] 推到F[i][i] ,最后我们就能比较从哪个位置前往终点最优了。

转移方程跟第一种想法差不多,只不过第一种想法是用小区间推大区间,所以会导致答案不能保证最优。

#include <bits/stdc++.h>
using namespace std;
int C, H, B;
int dp[1005][1005][2];
struct node{
    int x, t;
    bool operator<(const node &rhs)const{
        return x<rhs.x;
    }
}A[1005];

int main()
{
    scanf("%d %d %d", &C,&H,&B);
    for(int i=1; i<=C; i++){
        scanf("%d %d", &A[i].x, &A[i].t);
    }
    sort(A+1,A+C+1);
    memset(dp, 0x7f, sizeof(dp));
    dp[1][C][0] = max(A[1].x, A[1].t);
    dp[1][C][1] = max(A[C].x, A[C].t);
    for(int i=1; i<=C; i++){
        for(int j=C; j>=1; j--){
            dp[i][j][0] = min(dp[i][j][0], max(dp[i-1][j][0]+A[i].x-A[i-1].x, A[i].t));
            dp[i][j][0] = min(dp[i][j][0], max(dp[i][j+1][1]+A[j+1].x-A[i].x, A[i].t));

            dp[i][j][1] = min(dp[i][j][1], max(dp[i-1][j][0]+A[j].x-A[i-1].x, A[j].t));
            dp[i][j][1] = min(dp[i][j][1], max(dp[i][j+1][1]+A[j+1].x-A[j].x, A[j].t));
        }
    }
    int ans = INT_MAX;
    for(int i=1; i<=C; i++){
        ans = min(ans, min(dp[i][i][0], dp[i][i][1])+abs(B-A[i].x));
    }
    printf("%d\n", ans);
    return 0;
}
时间: 2024-10-13 12:57:26

BZOJ 3379: [Usaco2004 Open]Turning in Homework 交作业的相关文章

POJ 1991 Turning in Homework(区间DP)

题目链接 Turning in Homework 考虑区间DP f[i][j][0]为只考虑区间[i, j]且最后在a[i]位置交作业的答案. f[i][j][1]为只考虑区间[i, j]且最后在a[j]位置交作业的答案. 首先对a[i]升序排序(位置第一关键字,时间第二关键字) 然后就是区间DP了 f[i][j]可以从f[i][j + 1], f[i - 1][j]推过来. 即 f[i][j][0] = min(f[i][j][0], max(f[i][j + 1][1] + a[j + 1]

树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. Input 第一行N,M 接下来M行,每行形如1 a b c或2 a b c Outpu

算法交作业(一)

首先解释下标题的含义:在网上看了一位大牛写的基础算法相关的博文,感觉自己不是天赋异禀,所以决定自己实现一遍当作交作业. 开篇: 今天这篇博文是关于数组查找的,很简单. 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多人认为,算法是数学的内容,学起来特别麻烦.我们不能认为这种观点是错误的.但是我们也知道,软件是一种复合的技术,如果一个人只知道算法,但是不能用编程语言很好地实现,那么再优秀的算法也不能发挥作用.一个人只有有了很好的计算机知识和数学知识,才

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

在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提交表(Submit)这三个表之间的关系. 每个学生都属于一个班级 班级里的每个学生都会被布置同样的作业 学生提交作业后会在作业提交表中添加响应的记录,如学生的ID,作业的ID,提交的内容等. 可以按照以下步骤获取学生已交作业和未交作业 获取学生所在班级的所有作业 //获取学生所在班级的所有作业  p

BZOJ 3357: [Usaco2004]等差数列

3357: [Usaco2004]等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 338  Solved: 160[Submit][Status][Discuss] Description 约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7” 很容易看出“1,3,5,7”是等差数列. 给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度. Input 第1行:一个

BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果( dp )

dp dp( x , k ) = max( dp( x - 1 , k - 1 ) + *** , dp( x - 1 , k ) + *** ) *** = 0 or 1 ,根据情况 (BZOJ 1750双倍经验) ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm>

BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

题目 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description 一天有T(1≤T≤10^6)个时段.约翰正打算安排他的N(1≤N≤25000)只奶牛来值班,打扫 打扫牛棚卫生.每只奶牛都有自己的空闲时间段[Si,Ei](1≤Si≤Ei≤T),只能把空闲的奶牛安排出来值班.而且,每个时间段必需有奶牛在值班.  那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的

BZOJ 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复

题目 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 53  Solved: 37[Submit][Status] Description 奶牛贝茜被雇去建设N(2≤N≤1000)个牛棚间的互联网.她已经勘探出M(1≤M≤ 20000)条可建的线路,每条线路连接两个牛棚,而且会苞费C(1≤C≤100000).农夫约翰吝啬得很,他希望建设费用最少甚至他都不想给贝茜工钱. 

BZOJ 3357: [Usaco2004]等差数列( dp )

dp(x, p) 表示序列中第x个数, 上一个数是p构成的等差数列的最长. 转移时从[1, x)中枚举p = seq[] 就行了.时间复杂度O(n²logn) --------------------------------------------------------------------------------- #include<bits/stdc++.h> #define rep(i, n) for(int i = 0; i < n; i++) #define Rep(i,