• BZOJ——1571: [Usaco2009 Open]滑雪课Ski


    http://www.lydsy.com/JudgeOnline/problem.php?id=1571

    Time Limit: 10 Sec  Memory Limit: 64 MB
    Submit: 887  Solved: 499
    [Submit][Status][Discuss]

    Description

    Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪。很不幸,Bessie滑雪技术并不精湛。 Bessie了解到,在滑雪场里,每天会提供S(0<=S<=100)门滑雪课。第i节课始于M_i(1<=M_i<=10000),上的时间为L_i(1<=L_i<=10000)。上完第i节课后,Bessie的滑雪能力会变成A_i(1<=A_i<=100). 注意:这个能力是绝对的,不是能力的增长值。 Bessie买了一张地图,地图上显示了N(1 <= N <= 10,000)个可供滑雪的斜坡,从第i个斜坡的顶端滑至底部所需的时长D_i(1<=D_i<=10000),以及每个斜坡所需要的滑雪能力C_i(1<=C_i<=100),以保证滑雪的安全性。Bessie的能力必须大于等于这个等级,以使得她能够安全滑下。 Bessie可以用她的时间来滑雪,上课,或者美美地喝上一杯可可汁,但是她必须在T(1<=T<=10000)时刻离开滑雪场。这意味着她必须在T时刻之前完成最后一次滑雪。 求Bessie在实现内最多可以完成多少次滑雪。这一天开始的时候,她的滑雪能力为1.

    Input

    第1行:3个用空格隔开的整数:T, S, N。

    第2~S+1行:第i+1行用3个空格隔开的整数来描述编号为i的滑雪课:M_i,L_i,A_i。

    第S+2~S+N+1行:

    第S+i+1行用2个空格隔开的整数来描述第i个滑雪坡:C_i,D_i。

    Output

    一个整数,表示Bessie在时间限制内最多可以完成多少次滑雪。

    Sample Input

    10 1 2
    3 2 5
    4 1
    1 3

    Sample Output

    6

    HINT

    滑第二个滑雪坡1次,然后上课,接着滑5次第一个滑雪坡。

    Source

    Gold

    f[i][j]表示当前能力为j,时间为i的最多滑雪数,特殊的f[i][0]表示在i时刻,最大的滑雪数

    贪心的想:对于相同的能力,最晚的用时间学习得到最优,因为你可以用之前的能力与时间尽量多划几次

         且在能力足够的情况下,肯定是先划用时少的,

    记录下得到每个等级的能力的最小时间tim[j]和学到每个能力的最晚时间able[i][j],

    则 f[i][j]=max(f[i][j],f[i-tim[j]][j]+1,f[f[able[i][j]][0]).

     1 #include <cstring>
     2 #include <cstdio>
     3 
     4 #define min(a,b) (a<b?a:b)
     5 #define max(a,b) (a>b?a:b)
     6 
     7 inline void read(int &x)
     8 {
     9     x=0; register char ch=getchar();
    10     for(; ch>'9'||ch<'0'; ) ch=getchar();
    11     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
    12 }
    13 const int N(10005);
    14 const int M(105);
    15 int n,s,t,tim[M];
    16 int able[N<<1][M],f[N][M];
    17 
    18 int Presist()
    19 {
    20     read(t),read(s),read(n);
    21     for(int u,v,w,i=1; i<=s; ++i)
    22     {
    23         read(u),read(v),read(w),v+=u;
    24         able[v][w]=max(able[v][w],u);
    25     }
    26     memset(tim,127/3,sizeof(tim));
    27     for(int lim,cost,i=1; i<=n; ++i)
    28     {
    29         read(lim),read(cost);
    30         for(; lim<=100; ++lim)
    31             tim[lim]=min(tim[lim],cost);
    32     }
    33     memset(f,-63,sizeof(f));f[0][1]=0;
    34     for(int i=0; i<N; ++i) f[i][0]=0;
    35     for(int i=1; i<=t; ++i)
    36         for(int j=1; j<=100; ++j)
    37         {
    38             f[i][j]=f[i-1][j];
    39             if(able[i][j]) f[i][j]=max(f[i][j],f[able[i][j]][0]);
    40             if(i-tim[j]>=0) f[i][j]=max(f[i][j],f[i-tim[j]][j]+1);
    41             f[i][0]=max(f[i][0],f[i][j]);
    42         }
    43     printf("%d
    ",f[t][0]);
    44     return 0;
    45 }
    46 
    47 int Aptal=Presist();
    48 int main(int argc,char**argv){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Python入门-函数进阶
    Python入门-初始函数
    Leetcode300. Longest Increasing Subsequence最长上升子序列
    Leetcode139. Word Break单词拆分
    Leetcode279. Perfect Squares完全平方数
    Leetcode319. Bulb Switcher灯泡开关
    Leetcode322. Coin Change零钱兑换
    二叉树三种遍历两种方法(递归和迭代)
    Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
    Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7737883.html
Copyright © 2020-2023  润新知