题目链接: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;
}