首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

BZOJ 3856 Monster:C++ 入門級模擬題解析

     編輯:關於C++

題目大意

怪物初始血量 h,玩家攻擊力 a,怪物每回合回血 b,玩家連續攻擊 k 回合後需休息 1 回合。判斷玩家能否擊殺怪物。

核心邏輯:三種必勝情況

  1. 一擊必殺 (OTK):h <= a,第一刀直接秒殺。
  2. 第 k 回合內擊殺:前 k 回合怪物回血 k-1 次,若 k*a >= (k-1)*b + h 則在第 k 擊殺死。
  3. 長期戰略優勢:一個完整週期 (k 攻擊 + 1 休息) 後,怪物血量淨減少。即 k*a > (k+1)*b。若成立,隨時間怪物必死。

其餘情況玩家無法獲勝。

代碼實作 (注意長整數防溢位)

#include 
using namespace std;

int main() {
    long long h, a, b, k;
    int cnt = 0;
    while (scanf("%lld%lld%lld%lld", &h, &a, &b, &k) == 4 && (h||a||b||k)) {
        printf("Case #%d: ", ++cnt);
        if (h <= a || k*a >= (k-1)*b + h || k*a > (k+1)*b)
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}

關鍵點提醒

  • 使用 long long 防止 k*a 溢位 (k, a 可達 1e9)。
  • 條件判斷順序不影響正確性,但建議先判簡單條件 (OTK)。
  • 輸入以四個 0 結束,需正確處理終止條件。

變體:BZOJ 3856 Monster (不公平博弈)

同一題目,邏輯完全相同,僅敘述不同。代碼可通用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved