2020百度之星初赛第三场 Fight(模拟)

Problem Description
Mr Left,Mr Mid,Mr Right 正在玩游戏。他们初始都有 10001000 血,Mr Left,Mr Mid,Mr Right 的攻击力分别为 x,y,zx,y,z。

对于每一轮,假设仍然剩下至少两个人的血量大于 00,那么选出两个血量大于 00 的人对打,他们的血量分别扣除和他们对打的另一个人的攻击力。

当有至少两个人的血量小于等于 00 时,游戏结束。

请问在最优情况下,这个游戏最少多少轮结束?

Input
第一行一个正整数 test~(1 \leq test \leq 100)test (1≤test≤100) 表示数据组数。

接下来 testtest 行,每行三个正整数 x,y,z~(1 \leq x,y,z \leq 1000)x,y,z (1≤x,y,z≤1000) 表示 Mr Left, Mr Mid, Mr Right的攻击力。

Output
对于每组数据,一行一个整数表示答案。

Sample Input
2
1 1 1
1 2 3
Sample Output
1000
666

思路:
枚举A和B,A和C打了多少场,那么B和C最多能打多少场是确定的。如果还剩下了两个大于0的,就单独算一遍。

#include 
#include 
#include 
#include 

using namespace std;

const int INF = 0x3f3f3f3f;
const int maxn = 205;

int a[10];

int main() {
    int T;scanf("%d",&T);
    while(T--) {
        scanf("%d%d%d",&a[1],&a[2],&a[3]);
        sort(a + 1,a + 1 + 3);
        int ans = INF;
        for(int i = 0;i <= min(1000,min((1000 + a[1] - 1) / a[1],(1000 + a[2] - 1) / a[2]));i++) { //a[1]和a[2]打了多少轮
            int x = 1000 - a[2] * i,y = 1000 - a[1] * i,z = 1000;
            if(x <= 0 && y <= 0) {
                ans = min(ans,i);
                break;
            }
            for(int j = 0;j <= min((x + a[3] - 1) / a[3],(z + a[1] - 1) / a[1]);j++) { //a[1]和a[3]打了多少轮
                int num = 0; //a[2]和a[3]打了多少轮
                x -= j * a[3];
                z -= j * a[1];
                
                if(x <= 0 && z <= 0) {
                    ans = min(ans,i + j);
                }
                
                if(z > 0 && y > 0) {
                    num = min((y + a[3] - 1) / a[3],(z + a[2] - 1) / a[2]);
                    if(x > 0) {
                        y -= num * a[3];
                        z -= num * a[2];
                        int num2 = 0,num3 = 0;
                        if(y > 0) {
                            num2 = min((x + a[2] - 1) / a[2],(y + a[1] - 1) / a[1]);
                        }
                        
                        if(z > 0) {
                            num3 = min((x + a[3] - 1) / a[3],(z + a[1] - 1) / a[1]);
                        }
                        ans = min(ans,i + j + num + num2 + num3);
                        y += num * a[3];
                        z += num * a[2];
                    } else {
                        ans = min(ans,i + j + num);
                    }
                }
                
                x += j * a[3];
                z += j * a[1];
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(#,其他比赛题目,#,模拟)