zoukankan      html  css  js  c++  java
  • HDU 3008 Warcraft(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3008

    题目大意:人有100血和100魔法,每秒增加 t 魔法(不能超过100)。n个技能,每个技能消耗cost[i]魔法值,造成hurt[i]伤害。普通攻击不消耗魔法,每秒1伤害。

    boss有100血,每秒对人造成q伤害。每秒内,人先攻击,boss后攻击。问最少多少秒杀死boss?

    Sample Input

    4 2 25
    10 5
    20 10
    30 28
    76 70
    4 2 25
    10 5
    20 10 3
    0 28
    77 70
    0 0 0

    Sample Output

    4

    My god

    分析:普通攻击可以看做是魔法消耗为0,伤害为1的魔法攻击(这一小点能够节省时间)

      dp[i][j]表示第 i 秒 有 j 的魔法值时,boss受到伤害的值。

      if(   dp[ i ][ 上次剩余魔法 + 补充魔法 - K技能消耗 ]      <    dp[ i-1 ][ 上次剩余魔法 ] +  K技能打掉血量  )

                dp[ i ][ 上次剩余魔法 + 补充魔法 - K技能消耗 ]      =    dp[ i-1 ][ 上次剩余魔法 ] +  K技能打掉血量 ;

    很简单的状态转移吧,只是我不明白,比如如果第一秒只用普通攻击,那即使不消耗魔法,为什么dp[1][1...99]也要计算?

    代码如下:

     1 # include<stdio.h>
     2 # include<string.h>
     3 
     4 int cost[101],hurt[101]; //魔法 和 伤害
     5 int dp[101][101]; //
     6 
     7 int main(){
     8     int n,t,q;
     9     int i,j,k,temp,flag;
    10     cost[0] = 0;    hurt[0] = 1;    //普通攻击
    11 
    12     while(scanf("%d%d%d",&n,&t,&q) && n && t && q)
    13     {
    14         for(i=1;i<=n;i++)
    15             scanf("%d%d",&cost[i],&hurt[i]);
    16         memset(dp,0,sizeof(dp));
    17         flag = 0;
    18         for(i=1;(i-1)*q<100;i++)    //不能是<=100,因为自己死了的话,算输
    19         {
    20             for(j=0;j<=100;j++)
    21             {
    22                 for(k=0;k<=n;k++)
    23                 {
    24                     if(j-cost[k] < 0)
    25                         continue;
    26                     temp = (j-cost[k]+t>100) ? 100 : j-cost[k]+t;    //回复魔法超过100,按100计算
    27                     if(dp[i][temp] < dp[i-1][j] + hurt[k])
    28                         dp[i][temp] = dp[i-1][j] + hurt[k];
    29                     if(dp[i][temp] >= 100) //一旦boss伤害超过100,结束
    30                     {    flag=1; break;  }         
    31                 }
    32                 if(flag) break;
    33             }
    34             if(flag) break;
    35         }
    36         if(flag) printf("%d
    ",i);
    37         else  printf("My god
    ");
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3222801.html
Copyright © 2011-2022 走看看