一、题目信息
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 #include2 #include 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 }