zoukankan      html  css  js  c++  java
  • P2339 提交作业usaco

    P2339 提交作业usaco

    题目背景

    usaco

    题目描述

    贝西在哞哞大学选修了 C 门课,她要把所有作业分别交给每门课的老师,然后去车站和同学们一起回家。每个老师在各自的办公室里,办公室要等他们下课后才开,第 i 门课的办公室将在 Ti 分钟后开放。

    所有的办公室都在一条笔直的走廊上,这条走廊长 H 个单位,一开始贝西在走廊的尽头一侧,位于坐标为 0 的地方。第 i 门课的办公室坐标位于坐标为 Xi 的地方,车站的坐标为 B。贝西可在走廊上自由行走,每分钟可以向右或者向左移动一个单位,也可以选择停着不移动。如果走到一间已经开门的办公室,贝西就可以把相应的作业交掉了,走进办公室交作业是不计时间的。请帮助贝西计算一下,从她开始交作业开始,直到到交完所有作业,再走到车站,最短需要多少时间时间。

    输入输出格式

    输入格式:

    输入格式

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

    • 第二行到 C + 1 行:第 i + 1 行有两个整数 Xi 和 Ti, 0 ≤ Xi ≤ H , 0 ≤ Ti ≤ 10000

    输出格式:

    输出格式

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

    输入输出样例

    输入样例#1: 
    4 10 3
    8 9
    4 21
    3 16
    8 12
    
    输出样例#1: 
    22

    说明

    走到坐标 8 处,第 9 分钟交一本作业,等到第 12 分钟时,交另一本作业。再走到坐标 4 处交作业,最后走到坐标 3 处,交最后一本作业,此地就是车站所在位置,共用时 22 分钟

    ——————————————————————————————————————————————————————————————————

    好喵啊完全想不到我好菜啊

    把教室按坐标排序,如果第i个教室到第j个教室的作业都还没有交,那么先去i教室或者先去j教室要比先去中间的某个k教室更优,因为如果先去中间某个教室,之后必然还要走到i教室和j教室,那么不如先去i教室或者j教室,之后去另一端的教室时必然会经过中间的教室交作业。

    dp[i][j][1/0]表示除 [i,j] 以外的其它区间都已完成,0 表示在 i,且 i 已完成,1 表示在 j ,且 j 已完成。由大区间推小区间。

    对于当前的一个状态dp[i][j][0],可以从两种状态转移而来,一种是从i-1走到i,另一种是从i走到j+1,dp[i][j][1]同理

    code

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 1010;
    int C, H, B;
    int dp[MAXN][MAXN][2];
    
    struct Node {
        int X, T;
        bool operator < (const Node &t) {
            return X < t.X;
        }
    }a[MAXN];
    
    inline int read() {
        int num = 0, f = 1; char ch = getchar();
        while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
        while (isdigit(ch)) { num = num * 10 + ch - '0'; ch = getchar(); }
        return num * f; 
    }
    
    int main() {
        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);
        memset(dp, 127/3, 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 L = C - 2; L >= 0; -- L)
            for (int i = 1; i + L <= C; ++ i) {
                int j = i + L;
                dp[i][j][0] = min(max(dp[i-1][j][0] + a[i].X - a[i-1].X, a[i].T),
                                  max(dp[i][j+1][1] + a[j+1].X - a[i].X, a[i].T));
                dp[i][j][1] = min(max(dp[i-1][j][0] + a[j].X - a[i-1].X, a[j].T),
                                  max(dp[i][j+1][1] + a[j+1].X - a[j].X, a[j].T));
            }
        int ans = 0x7fffffff;
        for (int i = 1; i <= C; ++ i) 
            ans = min(ans, dp[i][i][0] + abs(a[i].X - B));
        cout << ans << endl;
        return 0;
    }

     然后。。。DZY强无敌!

  • 相关阅读:
    Oracle ref cursor和sys_refcursor
    一些命令可以帮您了解Linux 操作系统用户信息
    Linux 6上使用UDEV绑定共享存储
    Oracle VirtualBox 问题汇总
    Linux 常用操作
    CentOS 7 运行级别切换
    Oracle 更新Opatch、打补丁
    django rest framework restful 规范
    CBV FBV rest framework
    CRM
  • 原文地址:https://www.cnblogs.com/hkttg/p/9414049.html
Copyright © 2011-2022 走看看