80 饲料调配

问题描述 :

农夫约翰从来只用调配得最好的饲料来为他的奶牛。

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

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

例如,给出目标饲料 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

 

思想:使用克拉默法则,解出三元一次方程的解,然后对这组解进行最小化,即除以最大公因数,注意排除有一个数为0的情况。

 

#include <stdio.h>
#include <stdlib.h>

int ct(int a[], int b[], int c[]) //行列式计算
{ 
    return a[0] * (b[1] * c[2] - c[1] * b[2]) - a[1] * (b[0] * c[2] - c[0] * b[2]) + a[2] * (b[0] * c[1] - c[0] * b[1]);
}
int min(int a, int b)  //找不为0的最小数
{
    if(a==0){
        return b;
    }
    if(b==0){
        return a;
    }
    if (a > b)
    {
        return b;
    }
    else
    {
        return a;
    }
}
int main()
{
    int i, j, k;
    int f[3];
    int f1[3];
    int f2[3];
    int f3[3];
    scanf("%d %d %d", &f[0], &f[1], &f[2]);
    scanf("%d %d %d", &f1[0], &f1[1], &f1[2]);
    scanf("%d %d %d", &f2[0], &f2[1], &f2[2]);
    scanf("%d %d %d", &f3[0], &f3[1], &f3[2]);
    int d = ct(f1, f2, f3);
    int d1 = ct(f, f2, f3);
    int d2 = ct(f1, f, f3);
    int d3 = ct(f1, f2, f);
    if (d < 0)
    {
        d = -d;
        d1 = -d1;
        d2 = -d2;
        d3 = -d3;
    }
    if (d == 0 || d1 < 0 || d2 < 0 || d3 < 0)  //无解的情况
    {
        printf("NONE");
    }
    else
    {
        int temp1 = min(d1, d2);
        int temp2 = min(d2, d3);
        int m = min(temp1, temp2);  //从最小的那个数开始找最大公因数 且min函数保证了最小的那个数不会为0
        for (i = m; i > 0; i--)
        {
            if (d1 % i == 0 && d2 % i == 0 && d3 % i == 0&&d%i==0)  //均除以公因数
            {
                d1 /= i;
                d2 /= i;
                d3 /= i;
                d/=i;
            }
        }
        printf("%d %d %d %d", d1, d2, d3, d);
    }
    

        return 0;
}

 

posted @ 2022-03-09 13:16  梦想是能睡八小时的猪  阅读(89)  评论(0)    收藏  举报