標籤:usaco
WF上的水題,直接類比即可.注意為0情況的處理,我寫的有點複雜了.
代碼如下:
/*ID: 15674811LANG: C++TASK: ratios*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define INF 0x3f3f3f3fint xx[5],yy[5],zz[5],k4,sum,tmp;int check(int x,int y,int z){ if(!xx[1]&&x) return 0; if(!yy[1]&&y) return 0; if(!zz[1]&&z) return 0; if(xx[1]==0) { if(yy[1]==0) { tmp=z/zz[1]; return 1; } if(zz[1]==0) { tmp=y/yy[1]; return 1; } if(y%yy[1]||z%zz[1]) return 0; if(y/yy[1]==z/zz[1]) { tmp=y/yy[1]; return 1; } return 0; } if(yy[1]==0) { if(zz[1]==0) { tmp=x/xx[1]; return 1; } if(x%xx[1]||z%zz[1]) return 0; if(x/xx[1]==z/zz[1]) { tmp=x/xx[1]; return 1; } return 0; } if(zz[1]==0) { if(x%xx[1]||y%yy[1]) return 0; if(x/xx[1]==y/yy[1]) { tmp=y/yy[1]; return 1; } return 0; } if(x%xx[1]||y%yy[1]||z%zz[1]) return 0; if(x/xx[1]==y/yy[1]&&x/xx[1]==z/zz[1]) { tmp=x/xx[1]; return 1; } return 0;}int main(){ freopen("ratios.in","r",stdin); freopen("ratios.out","w",stdout); //freopen("in.txt","r",stdin); for(int i=1;i<=4;i++) scanf("%d%d%d",&xx[i],&yy[i],&zz[i]); sum=INF; int kk1,kk2,kk3; k4=-1; for(int k1=0;k1<100;k1++) for(int k2=0;k2<100;k2++) for(int k3=0;k3<100;k3++) { int x=k1*xx[2]+k2*xx[3]+k3*xx[4]; int y=k1*yy[2]+k2*yy[3]+k3*yy[4]; int z=k1*zz[2]+k2*zz[3]+k3*zz[4]; if(x==0&&y==0&&z==0) continue; if(check(x,y,z)&&sum>(k1+k2+k3)) { kk1=k1,kk2=k2,kk3=k3; k4=tmp; sum=k1+k2+k3; } } if(k4!=-1) printf("%d %d %d %d\n",kk1,kk2, kk3,k4); else printf("NONE\n"); return 0;}
USACO--3.2Feed Ratios