zoukankan      html  css  js  c++  java
  • 滑雪(dp好题)

    题目描述:贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣。贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开。滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求游客的能力达到 Ci 或以上时才能进入。贝西决心参加一些滑雪课程以提高自己的素质,这样可以在有限的时间内多滑几次坡。

    滑雪场提供了 S 门课程。第 i 门课的开始时刻为 Mi,持续 Li 分钟,如果想参加课程,就不能迟到或早退。上完课之后,贝西的滑雪能力将变成 Ai。注意,不是能力增加 Ai,而是变成 Ai,所以乱上课的话反而会使能力下降。贝西可以随意安排她的时间:滑雪、上课,或美美地喝上一杯可可汁。请问她如何安排上课和滑雪的时间,滑坡的次数才能达到最大?(懒得概括了。。)

    同一个坡可以滑无数次。

    输入格式

    • 第一行:三个整数 T ,S 和 N ,1 ≤ T ≤ 10^4 , 1 ≤ S ≤ 100, 1 ≤ N ≤ 10^5

    • 第二行到 S + 1 行:第 i + 1 行描述了第 i 门课程,分别为 Mi,Li 和 Ai,1 ≤ Mi , Li ≤ 10^4

    , 1 ≤Ai ≤ 100

    • 第 S + 2 行到 S + N + 1 行:第 S + i + 1 行描述了第 i 条斜坡,分别为 Ci 和 Di,1 ≤ Ci≤100, 1 ≤ Di ≤ 10^4

    输出格式

    • 单个整数,表示贝西可以滑完的最大次数

    解题过程:

    1.一开始被那么多的数据吓住了。。完全找不到头绪,然后就开始看数据范围来瞎凑。状态至少是二维的,当前的能力值肯定是要算在状态里的(因为最大只有100),然后N肯定不会拿来当状态(否则10^5 * 100=10^7,转移必须是O(1)才不会超时,而O(1)的转移肯定是做不到的。)。那么只能是用时间T来当状态。。F[i][j]表示时间为i且能力值为j的时候最多已经滑了多少次。。然后看了下样例解释,竟然同一个坡可以滑无数次。题目里竟然没说,还好没思路去看了下样例。。

    以后做题还是要认真看完样例解释,充分理解题意。。

    2.既然同一个坡可以滑很多次,那么机智的我们肯定会选择当前能滑的且时间花费最少的 去滑。所以用t[i]处理出需要能力值为i的山坡的最小花费。然后扫一遍求出can[i],即当前能力值为i的时候能滑的山坡的最小花费。can[i]=min(can[i-1],t[i]);

    3.对于状态F[i][j],首先可以继承F[i-1][j]的值,然后可以由F[i-can[j]][j]+1转移过来(滑一次花费最小的山坡)。

    那么如果学习了一门课呢?显然如果要学习一门课,课程的结束时间必须小于等于i,那么其实只考虑课程的结束时间等于i就行,因为F[i][j]会继承F[k][j]的值(k<i)。那么先预先处理处course[i][j] ,表示结束时间为i,学习后能力值为j的课程所要花费的最少时间,如果不存在则为无穷大。那么有:

    F[i][j]=max(F[i-1][j]  ,  F[i-can[j]][j]+1  ,   max(F[i-course[i][j]][k])  ) ,k<j.

    而对于 max(F[i-course[i][j]][k])  可以用s[i][j]保存下来,那么方程变为

    F[i][j]=max(F[i-1][j]  ,  F[i-can[j]][j]+1  ,   s[i-course[i][j]][j-1]) ;   在求F[i][j]的时候s[i-course[i][j]][j-1] 已经求出来了。

    算法复杂度O(100*N)

    下面给出来自YYL大神的O(S^2)算法,屌爆了。

    先把课程按开始时间排序。

    F[i]表示上完第i节后最多能滑多少个山坡。

    对于每个F[i],枚举它前面的课程(course[i].left  > course[j].right),那么在学完课程j到开始学课程i的这段时间里可以去滑雪,这段时间里的能力值当然就是course[i].cap;

    初始  F[i]=course[i].left/can[1] (i是第一节课)

    那么有 F[i]=max(F[j]+(course[i].left-course[j].right) / can[course[j].cap]);

    最后答案就是 ans=max(F[i]+(T-course[i].right)/can[course[i].cap]);

    ans=max(ans,T/can[1]);(考虑一节课也不上的情况)

    0ms秒杀所有数据啊,Orz Orz Orz Orz Orz。

  • 相关阅读:
    将excel文件的内容导入sql server数据库的方法
    DataGridView 中的 CheckBox
    TextBox的文本换行问题
    寻找TreeView中的项(c#)
    关于C#的几个问题
    远程通信
    人脸搜索项目开源了:人脸识别(M:N)Java版
    人脸识别中的重要环节对齐之3D变换Java版(文末附开源地址)
    揭秘人脸对齐之3D变换Java版(文末附开源地址)
    阿里云视觉智能开放平台的人脸1:N搜索的开源替代Java版(文末附开源地址)
  • 原文地址:https://www.cnblogs.com/vb4896/p/3977836.html
Copyright © 2011-2022 走看看