1. 程式人生 > >Usaco Training Section 3.2 Feed Ratios

Usaco Training Section 3.2 Feed Ratios

有4組比例a:b:c,a1:b1:c1,a2:b2:c2,a3:b3:c3,求x,y,z使(a1*x+b1*y+c1*z):(a2*x+b2*y+c2*z):(a3*x+b3*y+c3*z)=a:b:c(0<=x,y,z<100)

其實也不是什麼難題,直接100^3暴力就行。

不過細節還挺多的。

  1. 注意0的情況。
  2. 注意是大寫的"NONE"
  3. 注意a:b:c(99:99:99!=1:1:1)
#include<bits/stdc++.h>
using namespace std;

inline int read(){
    int x=0;char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x;
}

int a[4],b[4][4],s[4];
int main()
{
    freopen("ratios.in","r",stdin);
    freopen("ratios.out","w",stdout);
    for(int i=1;i<=3;++i) a[i]=read();
    int x=__gcd(a[1],a[2]),y=__gcd(a[1],a[3]);
    int zz=__gcd(x,y);
    for(int i=1;i<=3;++i)
        for(int j=1;j<=3;++j)
            b[i][j]=read();
    for(int i=0;i<100;++i)
        for(int j=0;j<100;++j)
            for(int k=0;k<100;++k){
                s[1]=b[1][1]*i+b[2][1]*j+b[3][1]*k;
                s[2]=b[1][2]*i+b[2][2]*j+b[3][2]*k;
                s[3]=b[1][3]*i+b[2][3]*j+b[3][3]*k;
                if(s[1]<a[1]||s[2]<a[2]||s[3]<a[3]) continue;
                x=__gcd(s[1],s[2]),y=__gcd(s[1],s[3]);
                int z=__gcd(x,y);
                if(z!=0)
                    for(int l=1;l<=3;++l) s[l]/=z;
                bool f=1;
                for(int l=1;l<=3;++l)
                    if(s[l]!=a[l]/zz){f=0;break;}
                if(f){
                    printf("%d %d %d %d\n",i,j,k,z/zz);
                    return 0;
                }
            }
    puts("NONE");
}