题目链接
有三个人,初始都是1000血,现在要让活着的两两相互打架,每个人都有固定伤害,每一回合都是相互受到对方的伤害。问最少几个回合结束游戏(只剩下一个人活着)。
然后,我们枚举两个人打架的回合数,也就是枚举每两个人要打几个回合,然后就可以O(1)贪心的去算出剩下要打的回合。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
int a[3];
inline int solve(int day)
{
int sum = day;
int hp[3] = {1000, 1000, 1000};
hp[0] -= day * a[1];
hp[1] -= day * a[0];
int tmp = ceil(1. * hp[0] / a[2]);
sum += tmp;
hp[2] -= tmp * a[0];
tmp = min(ceil(1. * hp[1] / a[2]), ceil(1. * hp[2] / a[1]));
sum += tmp;
return sum;
}
bool alive(int x) { return x > 0; }
inline int solve_2(int day)
{
int sum = day;
int hp[3] = {1000, 1000, 1000};
hp[1] -= day * a[2];
hp[2] -= day * a[1];
if(alive(hp[1])) //1, 2:alive
{
int tmp = min(ceil(1. * hp[0] / a[2]), ceil(1. * hp[2] / a[0]));
sum += tmp;
hp[0] -= tmp * a[2];
hp[2] -= tmp * a[0];
if(alive(hp[0]))
{
tmp = min(ceil(1. * hp[0] / a[1]), ceil(1. * hp[1] / a[0]));
sum += tmp;
}
else
{
tmp = min(ceil(1. * hp[1] / a[2]), ceil(1. * hp[2] / a[1]));
sum += tmp;
}
}
else if(alive(hp[2]))
{
int tmp = min(ceil(1. * hp[0] / a[2]), ceil(1. * hp[2] / a[0]));
sum += tmp;
}
return sum;
}
int main ()
{
int T; scanf("%d", &T);
while(T--)
{
for(int i=0; i<3; i++) scanf("%d", &a[i]);
sort(a, a + 3);
int _UP = ceil(1000. / a[1]);
int ans = INF;
for(int i=0; i<=_UP; i++)
{
ans = min(ans, solve(i));
}
_UP = ceil(1000. / a[2]);
for(int i=0; i<=_UP; i++)
{
ans = min(ans, solve_2(i));
}
printf("%d\n", ans);
}
return 0;
}