The - Modcrab——使用贪心策略

一、题目信息

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\n", cnt);
27     for (int i = 1; i <= cnt; i++)
28     {
29         if (res[i] == 1)  printf("STRIKE\n");
30         if(res[i] == 2)  printf("HEAL\n");
31     }
32     return 0;
33 }

 

转载于:https://www.cnblogs.com/lfri/p/9310957.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值