1. 程式人生 > >The - Modcrab——使用貪心策略

The - Modcrab——使用貪心策略

spa for clu ems lse 生命 超過 證明 +=

一、題目信息

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 }

The - Modcrab——使用貪心策略