同 BZOJ 3856 Monster,敘述為「不公平博弈」。貓咪初始血量 h,先手每回合砍 a 點傷害,貓咪回手回 b 點血,先手連續 k 回合攻擊後休息 1 回合。判斷先手能否砍死貓咪。
h <= ak 回合貓咪回血 k-1 次,總傷害 k*a,總回血 (k-1)*b,需 k*a >= h + (k-1)*b。等價 h - k*(a-b) - b <= 0。k 攻擊 + 1 休息) 共 k+1 回合,貓咪受傷 k*a,回血 (k+1)*b。若 k*a > (k+1)*b,則每輪貓咪血量遞減,最終必死。等價 k*(b-a) + b < 0。#includeusing namespace std; long long h, a, b, k; int cnt; int main() { while (cin >> h >> a >> b >> k, h||a||b||k) { if (h <= a || h - k*(a-b) - b <= 0 || k*(b-a) + b < 0) printf("Case #%d: YES\n", ++cnt); else printf("Case #%d: NO\n", ++cnt); } return 0; }
k 次攻擊前,貓咪已回血 k-1 次。血量 = h - (k-1)*a + (k-1)*b。第 k 次攻擊後血量 = h - k*a + (k-1)*b。需 ≤ 0 → k*a >= h + (k-1)*b。k 攻擊 + 1 休息) 淨傷害 = k*a - (k+1)*b。若 > 0,血量單調遞減,必死。long long 避免乘法溢位。