zoukankan      html  css  js  c++  java
  • The

    一、题目信息

    The - Modcrab

    简单翻译一下:Vova有生命值h1,每次攻击值为a1,每瓶药水恢复生命值c1;Modcrab有生命值h2,每次攻击值为a2。在每个关卡开始,Vova有两种选择,要么攻击怪兽Modcrab,要么喝一瓶药水(Modcrab的生命值允许超过h2),然后,如果战斗没有结束,Modcrab会攻击Vova。战斗结束的标志是Vova(或Modcrab)的生命值降至0,或者更低。

    注:1、选择喝药水,Modcrab也会攻击Vova。2、攻击是有先后顺序的

    二、算法描述

    网上有一些描述“贪心策略证明”的方法是这么说的:

    考察一个问题的最优解,证明可修改该最优解,使得其从贪心选择开始,然后用数学归纳法证明每一步都可以通过贪心选择得到最优解
    1,假定首选元素不是贪心选择所要的元素,证明将首元素替换成贪心选择所需元素,依然得到最优解;
    2,数学归纳法证明每一步均可通过贪心选择得到最优解

    在这里,如果h1 > a2或者a1 >= h2,我们可以每次都选择攻击,直到条件不满足,才喝药水。根据证明贪心策略的方法,很明显这里符合贪心的条件。

    三、算法实现

     1 #include<stdio.h>
     2 #include<vector>
     3 
     4 int res[10000], cnt = 0;
     5 int main()
     6 {
     7     int h1, a1, c1, h2, a2;
     8     scanf("%d%d%d", &h1, &a1, &c1);
     9     scanf("%d%d", &h2, &a2);
    10     memset(res, 0, sizeof(res));
    11     while (h2 > 0)
    12     {
    13         if(h1 <= a2 && h2 > a1)
    14         {
    15             h1 += c1;
    16             h1 -= a2;
    17             res[++cnt] = 2;
    18         } 
    19         else
    20         {
    21             h1 -= a2;
    22             h2 -= a1;
    23             res[++cnt] = 1;
    24         }
    25     }
    26     printf("%d
    ", cnt);
    27     for (int i = 1; i <= cnt; i++)
    28     {
    29         if (res[i] == 1)  printf("STRIKE
    ");
    30         if(res[i] == 2)  printf("HEAL
    ");
    31     }
    32     return 0;
    33 }
  • 相关阅读:
    快排
    装载问题加强版
    從 Internet 安裝 Cygwin
    操作系统:基于页面置换算法的缓存原理详解(上)
    Java设计模式——适配器模式
    Unity 协程使用指南
    2015年总结
    基于正态分布的图片高斯模糊算法
    数据结构:关于AVL树的平衡旋转详解
    算法:关于生成抽样随机数的这些算法
  • 原文地址:https://www.cnblogs.com/lfri/p/9310957.html
Copyright © 2011-2022 走看看