3.2.4 Feed Ratios 饲料调配

3.2.4 Feed Ratios 饲料调配

时间: 1ms        内存:64M

描述:

农夫约翰从来只用调配得最好的饲料来为他的奶牛。饲料用三种原料调配成:大麦,燕麦和小麦。他知道自己的饲料精确的配比,在市场上是买不到这样的饲料的。他只好购买其他三种混合饲料(同样都由三种麦子组成),然后将它们混合,来调配他的完美饲料。

给出三组整数,表示 大麦:燕麦:小麦 的比例,找出用这三种饲料调配 x:y:x 的饲料的方法。

例如,给出目标饲料 3:4:5 和三种饲料的比例:

1:2:3
3:7:1
2:1:2
你必须编程找出使这三种饲料用量最少的方案,要是不能用这三种饲料调配目标饲料,输出“NONE”。“用量最少”意味着三种饲料的用量(整数)的和必须最小。
对于上面的例子,你可以用8份饲料1,2份饲料2,和5份饲料3,来得到7份目标饲料:

8*(1:2:3) + 1*(3:7:1) + 5*(2:1:2) = (21:28:35) = 7*(3:4:5)

表示饲料比例的整数,都是小于100(数量级)的非负整数。表示各种饲料的份数的整数,都小于100。一种混合物的比例不会由其他混合物的比例直接向加得到。

输入:

Line 1: 三个用空格分开的整数,表示目标饲料
Line 2..4: 每行包括三个用空格分开的整数,表示农夫约翰买进的饲料的比例

输出:

输出文件要包括一行,这一行要么有四个整数,要么是“NONE”。前三个整数表示三种饲料的份数,用这样的配比可以得到目标饲料。第四个整数表示混合前三种饲料后得到的目标饲料的份数。

示例输入:

3 4 5 1 2 3 3 7 1 2 1 2 

示例输出:

8 1 5 7 

提示:

参考答案(内存最优[1268]):

#include <iostream>
using namespace std;

typedef struct
{
    int x;
    int y;
    int z;
}ratio;

ratio dr;
ratio rr[3];
bool flag;

int main()
{
    int i,j,k;
    int tmpx,tmpy,tmpz,res;
    cin>>dr.x>>dr.y>>dr.z;
    for(i=0;i<3;i++)
        cin>>rr[i].x>>rr[i].y>>rr[i].z;
    flag=false;
    for(i=0;i<100;i++)
    {
        for(j=0;j<100;j++)
        {
            for(k=0;k<100;k++)
            {
                tmpx=rr[0].x*i+rr[1].x*j+rr[2].x*k;
                tmpy=rr[0].y*i+rr[1].y*j+rr[2].y*k;
                tmpz=rr[0].z*i+rr[1].z*j+rr[2].z*k;
                if(((dr.x!=0)&&(tmpx==0))||((dr.y!=0)&&(tmpy==0))||((dr.z!=0)&&(tmpz==0)))
                    continue;
                if(((tmpx!=0)&&(tmpx%dr.x!=0))||((tmpy!=0)&&(tmpy%dr.y!=0))||((tmpz!=0)&&(tmpz%dr.z!=0)))
                    continue;
                if((tmpx*dr.y==tmpy*dr.x)&&(tmpy*dr.z==tmpz*dr.y))
                {
                    if(tmpx!=0)
                        res=tmpx/dr.x;
                    else if(tmpy!=0)
                        res=tmpy/dr.y;
                    else if(tmpz!=0)
                        res=tmpz/dr.z;
                    flag=true;
                    break;
                }
            }
            if(flag==true)
                break;
        }
        if(flag==true)
            break;
    }
    if(flag==false)
        cout<<"NONE"<<endl;
    else
        cout<<i<<" "<<j<<" "<<k<<" "<<res<<endl;;
    return 0;
}

参考答案(时间最优[36]):

#include <iostream>
using namespace std;

typedef struct
{
    int x;
    int y;
    int z;
}ratio;

ratio dr;
ratio rr[3];
bool flag;

int main()
{
    int i,j,k;
    int tmpx,tmpy,tmpz,res;
    cin>>dr.x>>dr.y>>dr.z;
    for(i=0;i<3;i++)
        cin>>rr[i].x>>rr[i].y>>rr[i].z;
    flag=false;
    for(i=0;i<100;i++)
    {
        for(j=0;j<100;j++)
        {
            for(k=0;k<100;k++)
            {
                tmpx=rr[0].x*i+rr[1].x*j+rr[2].x*k;
                tmpy=rr[0].y*i+rr[1].y*j+rr[2].y*k;
                tmpz=rr[0].z*i+rr[1].z*j+rr[2].z*k;
                if(((dr.x!=0)&&(tmpx==0))||((dr.y!=0)&&(tmpy==0))||((dr.z!=0)&&(tmpz==0)))
                    continue;
                if(((tmpx!=0)&&(tmpx%dr.x!=0))||((tmpy!=0)&&(tmpy%dr.y!=0))||((tmpz!=0)&&(tmpz%dr.z!=0)))
                    continue;
                if((tmpx*dr.y==tmpy*dr.x)&&(tmpy*dr.z==tmpz*dr.y))
                {
                    if(tmpx!=0)
                        res=tmpx/dr.x;
                    else if(tmpy!=0)
                        res=tmpy/dr.y;
                    else if(tmpz!=0)
                        res=tmpz/dr.z;
                    flag=true;
                    break;
                }
            }
            if(flag==true)
                break;
        }
        if(flag==true)
            break;
    }
    if(flag==false)
        cout<<"NONE"<<endl;
    else
        cout<<i<<" "<<j<<" "<<k<<" "<<res<<endl;;
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注