题意:
打怪兽游戏 我的血量hpy、攻击atky、防御defy 怪兽的血量hpm、攻击atkm、防御defm 每秒我损失血量max(0,atkm-defy) 怪兽损失血量max(0,atky-defm) 如果某一时刻我活着怪兽死了 算我胜利 购买1点hp花费h购买1点atk花费a购买1点def花费d 问最少多少花费能保证胜利 题目中数字均小于100
思路:
数字很小想到暴力枚举就好 不过这题要仔细讨论枚举上界
易知最多用100s就能杀死怪兽 (在能杀死的情况下)
对于hp 怪兽对我造成伤害最大为100 能持续100s 因此上界应该是10000
对于atk 怪兽hp最多100 防御最大100 为了保证在1s内杀死怪兽 上界应该是200
对于def 怪兽攻击最大100 因此上界100足矣
讨论出来后发现3个一起枚举会TLE 那么采用枚举2个计算另一个的方式
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> #include<set> #include<vector> #include<queue> #include<cstdlib> #include<ctime> #include<cmath> using namespace std; typedef long long LL; #define N 6010 int hy, ay, dy; int hm, am, dm; int h, a, d; int ans = 100000000; int main() { scanf("%d%d%d%d%d%d%d%d%d", &hy, &ay, &dy, &hm, &am, &dm, &h, &a, &d); for (int i = 0; i <= 200; i++) { for (int j = 0; j <= 100; j++) { int atk = ay + i; int def = dy + j; if (atk > dm) { if (def >= am) ans = min(ans, i * a + j * d); else { int t = hm / (atk - dm); if (t * (atk - dm) < hm) t++; int should = (am - def) * t + 1; if (should > hy) should -= hy; else should = 0; ans = min(ans, i * a + j * d + should * h); } } } } printf("%d\n", ans); return 0; }