• XMU 1056 瞌睡 vs 听课 【动态规划】


    1056: 瞌睡 vs 听课

    Time Limit: 500 MS  Memory Limit: 64 MB
    Submit: 19  Solved: 6
    [Submit][Status][Web Board]

    Description

      最近TheBeet为了准备校赛的题目,忙得没日没夜的。结果导致睡眠不足,第二天上课打瞌睡。
      老师每分钟讲的东西都很重要,打瞌睡的话肯定会漏掉老师讲的很多内容。好在TheBeet事先看过书,知道这节课大致会讲什么内容,他知道老师第i分钟讲的内容量为Vi。现在TheBeet必须用自己现有的精力去听更多的内容。
      已知TheBeet每分钟有4种状态:

    1. 聚精会神听老师讲课:这种情况下TheBeet能获取所有老师讲的内容,但是每分钟消耗3点精力。
    2. 趴在桌子上听老师讲课:这种情况下TheBeet能获取50%老师讲的内容,每分钟消耗1点精力。
    3. 发呆:这种情况下TheBeet什么也听不进去,但是也不消耗精力。
    4. 打瞌睡:瞌睡的第i分钟TheBeet回复i-1点精力。简单说就是说TheBeet打了一个k分钟的瞌睡后,会回复(k-1)*k/2点精力。另外每个瞌睡长度必须要大于等于3分钟。

      TheBeet这节课刚开始时的精力为M点。过程中TheBeet必须保证自己的精力是大于等于0的。比如当TheBeet的精力等于2的时候,他就不能聚精会神听老师讲课了。现在您来告诉TheBeet,他这节课(一节课45分钟)能听的内容重要程度的总和最大为多少。

    Input

      输入的第一行为一个整数M(0<=M<=150),表示TheBeet这节课开始时候的精力。
      接下来有45个正整数Vi(0<Vi<=100),用空格或换行隔开,表示这节课每分钟老师讲的内容量。

    Output

      输出一个整数数字,表示TheBeet最多能听的多少内容。如果答案不是整数,请四舍五入。

    Sample Input

    10
    100 100 100 100 100 100 100 100 100 100
    1 1 1 1 1 1 1 1 1 100
    1 100 1 100 1 100 1 100 1 100
    1 100 1 100 1 100 1 100 1 100
    1 1 100 1 1

    Sample Output

    1750

    HINT

      样例的解释:

      TheBeet先睡4分钟,从中获得6点精力,此时共有16点精力。然后认真听5分钟和趴桌子上听1分钟,获得550内容。此时精力为0。然后睡9分钟,获得36点精力,然后当老师在讲100内容的东西时认真听一下,其余时间发呆,最后共获得1750点内容。

    Source

    [Submit][Status][Web Board]

    题目链接:

      http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1056

    题目大意:

      一个人有m的精力值,一节课45分钟,第i分钟有个价值a[i],有几种策略,求最大能获得多少价值?

    1. 聚精会神听老师讲课:这种情况下TheBeet能获取所有老师讲的内容,但是每分钟消耗3点精力。
    2. 趴在桌子上听老师讲课:这种情况下TheBeet能获取50%老师讲的内容,每分钟消耗1点精力。
    3. 发呆:这种情况下TheBeet什么也听不进去,但是也不消耗精力。
    4. 打瞌睡:瞌睡的第i分钟TheBeet回复i-1点精力。简单说就是说TheBeet打了一个k分钟的瞌睡后,会回复(k-1)*k/2点精力。另外每个瞌睡长度必须要大于等于3分钟。

      

    题目思路:

      【动态规划】

      设f[i][j]表示前i分钟拥有精力值为j的最大价值。(注意由于睡觉可以回复精力所以不能只枚举到m,45分钟如果都认真听消耗不会超过150精力,所以我枚举到m+150,其实可以更小)

      可以根据四种策略得到四种状态转移。一次求解即可,最后解在f[n]中最大的。

      注意边界条件~

     1 /****************************************************
     2     
     3     Author : Coolxxx
     4     Copyright 2017 by Coolxxx. All rights reserved.
     5     BLOG : http://blog.csdn.net/u010568270
     6     
     7 ****************************************************/
     8 #include<bits/stdc++.h>
     9 #pragma comment(linker,"/STACK:1024000000,1024000000")
    10 #define abs(a) ((a)>0?(a):(-(a)))
    11 #define lowbit(a) (a&(-a))
    12 #define sqr(a) ((a)*(a))
    13 #define mem(a,b) memset(a,b,sizeof(a))
    14 const double EPS=1e-8;
    15 const int J=10;
    16 const int MOD=100000007;
    17 const int MAX=0x7f7f7f7f;
    18 const double PI=3.14159265358979323;
    19 const int N=54;
    20 const int M=1504;
    21 using namespace std;
    22 typedef long long LL;
    23 double anss;
    24 LL aans;
    25 int cas,cass;
    26 int n,m,lll,ans;
    27 int a[N];
    28 double f[N][M];
    29 int main()
    30 {
    31     #ifndef ONLINE_JUDGE
    32     freopen("1.txt","r",stdin);
    33 //    freopen("2.txt","w",stdout);
    34     #endif
    35     int i,j,k;
    36     int x,y,z;
    37 //    for(scanf("%d",&cass);cass;cass--)
    38 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
    39 //    while(~scanf("%s",s))
    40     while(~scanf("%d",&m))
    41     {
    42         n=45;
    43         for(i=1;i<=n;i++)
    44         {
    45             scanf("%d",&a[i]);
    46             a[i]*=10;
    47         }
    48         for(i=0;i<=m+150;i++)
    49             f[0][i]=-1e8;
    50         f[0][m]=0;
    51         for(i=1;i<=n;i++)
    52         {
    53             for(j=0;j<=m+150;j++)
    54             {
    55                 f[i][j]=f[i-1][j];
    56                 if(j+3<=m+150)f[i][j]=max(f[i][j],f[i-1][j+3]+a[i]);
    57                 if(j+1<=m+150)f[i][j]=max(f[i][j],f[i-1][j+1]+0.5*a[i]);
    58                 for(k=3;k<=i && j>=(k*k-k)/2;k++)
    59                     f[i][j]=max(f[i][j],f[i-k][j-(k*k-k)/2]);
    60             }
    61         }
    62         for(i=0;i<=m+150;i++)
    63             anss=max(anss,f[n][i]);
    64         ans=int(anss);
    65         if(ans%10>=5)ans+=10;
    66         printf("%d
    ",ans/10);
    67     }
    68     return 0;
    69 }
    70 /*
    71 //
    72 
    73 //
    74 */
    View Code
  • 相关阅读:
    不用服务器也能跑的框架wojilu
    PLI 到 COBOL 的转换数据类型 【不搞Mainframe的可能看不懂,冷门的语言】
    我记录网站综合系统 技术原理解析[8:ActionChecker流程]
    纪念VB.NET君
    我记录网站综合系统 技术原理解析[7:CSS类]
    我记录网站综合系统 技术原理解析[10:PermissionChecker流程]
    我记录网站综合系统 技术原理解析[6:内容初始化处理]
    我记录网站综合系统 技术原理解析[9:HttpMethodChecker流程]
    怎么打败腾讯[纯讨论]
    VisualStudio2012新特性[路边社通稿]
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/6745257.html
Copyright © 2020-2023  润新知