题意:
打怪兽游戏 我的血量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;
}