Fight【枚举】-2020百度之星3

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6789

分析:

一开始认为要选取什么贪心的策略,但其实只要暴力枚举即可。枚举 (Left、Mid,Left、Right) 之间打了多少轮,那么 (Mid、Right) 还要打几轮是可以直接算出来的,求最值即可。

代码:

#include <bits/stdc++.h>

using namespace std;

int solve(int a,int ra,int b,int rb)
{
    int t1=(ra+b-1)/b,t2=(rb+a-1)/a;
    int cnt=min(t1,t2);
    ra=max(ra-cnt*b,0);
    rb=max(rb-cnt*a,0);
    return cnt;
}
int main()
{
    int t,x,y,z;
    scanf("%d",&t);
    while(t--)
    {
        int ans=1000,res=0;
        scanf("%d%d%d",&x,&y,&z);
        for(int i=0;i<=1000;i++)//1-2
        {
            int w1=max(1000-y*i,0),w2=max(1000-x*i,0),w3=1000;
            if(w1==0&&w2==0)
            {
                ans=min(ans,i);
                break;
            }
            if(w1==0)
            {
                res=solve(y,w2,z,w3)+i;
                ans=min(res,ans);
                break;
            }
            if(w2==0)
            {
                res=solve(x,w1,z,w3)+i;
                ans=min(res,ans);
                break;
            }
            for(int j=0;j<=1000;j++)//1-3
            {
                int tw1=max(w1-z*j,0);
                int tw3=max(w3-x*j,0);
                if(tw1==0&&tw3==0)
                {
                    ans=min(i+j,ans);
                    break;
                }
                if(tw1==0)
                {
                    res=solve(y,w2,z,tw3)+i+j;
                    ans=min(res,ans);
                    break;
                }
                if(tw3==0)
                {
                    res=solve(x,tw1,y,w2)+i+j;
                    ans=min(res,ans);
                    break;
                }
                int t1=(w2+z-1)/z,t2=(tw3+y-1)/y;
                if(t1==t2)
                    ans=min(ans,t1+i+j);
            }
        }
        printf("%d
",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/1024-xzx/p/13382609.html