Fight【列舉】-2020百度之星3
阿新 • • 發佈:2020-07-27
題目連結: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\n",ans); } return 0; }