Feed Ratios(暴力)

Feed Ratios
1998 ACM Finals, Dan Adkins

Farmer John feeds his cows only the finest mixture of cow food, which has three components: Barley, Oats, and Wheat. While he knows the precise mixture of these easily mixable grains, he can not buy that mixture! He buys three other mixtures of the three grains and then combines them to form the perfect mixture.

Given a set of integer ratios barley:oats:wheat, find a way to combine them IN INTEGER MULTIPLES to form a mix with some goal ratio x:y:z.

For example, given the goal 3:4:5 and the ratios of three mixtures:

        1:2:3
        3:7:1
        2:1:2

your program should find some minimum number of integer units (the `mixture') of the first, second, and third mixture that should be mixed together to achieve the goal ratio or print `NONE'. `Minimum number' means the sum of the three non-negative mixture integers is minimized.

For this example, you can combine eight units of mixture 1, one unit of mixture 2, and five units of mixture 3 to get seven units of the goal ratio:

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

Integers in the goal ratio and mixture ratios are all non-negative and smaller than 100 in magnitude. The number of units of each type of feed in the mixture must be less than 100. The mixture ratios are not linear combinations of each other.

PROGRAM NAME: ratios

INPUT FORMAT

Line 1:Three space separated integers that represent the goal ratios
Line 2..4:Each contain three space separated integers that represent the ratios of the three mixtures purchased.

SAMPLE INPUT (file ratios.in)

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

OUTPUT FORMAT

The output file should contain one line containing four integers or the word `NONE'. The first three integers should represent the number of units of each mixture to use to obtain the goal ratio. The fourth number should be the multiple of the goal ratio obtained by mixing the initial feed using the first three integers as mixing ratios.

SAMPLE OUTPUT (file ratios.out)

8 1 5 7

 

        题意:

        给出 3 个数,还有 3 X 3 的矩阵,可以对每一行乘上一个系数,使最终对应加起来能得到给出的 3 个数,可以提出公因子,输出这 3 个系数和公因子。凑不出则输出 NONE。数据小于100。

 

        思路:

        乍一看就想到高斯消元。但是一看数据才小于 100,所以果断暴力了。因为可能会有除 0 的状况,所以每一种情况都讨论了一遍。

 

        AC:

/*
ID:sum-g1
LANG:C++
PROG:ratios
*/

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

int main() {

    freopen("ratios.in","r",stdin);
    freopen("ratios.out","w",stdout);

    int A, B, C;
    int num[5][5];
    scanf("%d%d%d", &A, &B, &C);

    for (int i = 1; i <= 3; ++i)
        for (int j = 1; j <= 3; ++j)
            scanf("%d", &num[i][j]);

    int temp = 0;
    for (int x = 0; x <= 100; ++x) {
        for (int y = 0; y <= 100; ++y) {
            for (int z = 0; z <= 100; ++z) {
                int aa = x * num[1][1] + y * num[2][1] + z * num[3][1];
                int bb = x * num[1][2] + y * num[2][2] + z * num[3][2];
                int cc = x * num[1][3] + y * num[2][3] + z * num[3][3];
                int t1, t2, t3;

                if (!A && B && C) {
                    if (!bb || !cc || aa) continue;
                    if (bb % B || cc & C) continue;
                    if (bb / B == cc / C) {
                        printf("%d %d %d %d\n", x, y, z, bb / B);
                        temp = 1;
                        break;
                    }
                } else if (A && !B && C) {
                    if (!aa || bb || !cc) continue;
                    if (aa % A || cc % C) continue;
                    if (aa / A == cc / C) {
                        printf("%d %d %d %d\n", x, y, z, aa / A);
                        temp = 1;
                        break;
                    }
                } else if (A && B && !C) {
                    if (!aa || !bb || cc) continue;
                    if (aa % A || bb % B) continue;
                    if (aa / A == bb / B) {
                        printf("%d %d %d %d\n", x, y, z, bb / B);
                        temp = 1;
                        break;
                    }
                } else if (!A && !B && C) {
                    if (aa || bb || !cc) continue;
                    if (cc % C) continue;
                    printf("%d %d %d %d\n", x, y, z, cc / C);
                    temp = 1;
                    break;
                } else if (!A && B && !C) {
                    if (aa || !bb || cc) continue;
                    if (bb % B) continue;
                    printf("%d %d %d %d\n", x, y, z, bb / B);
                    temp = 1;
                    break;
                } else if (A && !B && !C) {
                    if (!aa || bb || cc) continue;
                    if (aa % A) continue;
                    printf("%d %d %d %d\n", x, y, z, aa / A);
                    temp = 1;
                    break;
                } else if (!A && !B && !C) {
                    printf("%d %d %d %d\n", 0, 0, 0, 0);
                    temp = 1;
                    break;
                } else {
                    if (!aa || !bb || !cc) continue;
                    if (aa % A || bb % B || cc % C) continue;
                    if (aa / A == bb / B && aa / A == cc / C) {
                        printf("%d %d %d %d\n", x, y, z, aa / A);
                        temp = 1;
                        break;
                    }
                }
            }
            if (temp) break;
        }
        if (temp) break;
    }

    if (!temp) printf("NONE\n");

    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值