Fight【枚举】

题目链接


  有三个人,初始都是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;
}

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/107598981