Zeray Rice

..

[USACO 3.2] Feed Ratios

解析

枚举。。。 还是枚举。。嗯.. 最直接最简单有效的算法… 因为要求答案是方案之和最小的..所以可以先枚举方案数之和.. 然后通过相减得出的第一个方案就是最小的.. 直接输出结束程序即可~~

传送门

代码

懒得贴Gist了… 直接扔Github链接好了

处理0的部分写的有点丑@@ 囧囧

USACO 3.2 Feed Ratios raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
USER: fanzeyi1
TASK: ratios
LANG: C++
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

int feed[3][3];
int target[3];

int check(int i, int j, int k) {
    double a = i * feed[0][0] + j * feed[1][0] + k * feed[2][0];
    double b = i * feed[0][1] + j * feed[1][1] + k * feed[2][1];
    double c = i * feed[0][2] + j * feed[1][2] + k * feed[2][2];
    if(target[0] == 0 && a != 0) {
        return 0;
    }
    if(target[1] == 0 && b != 0) {
        return 0;
    }
    if(target[2] == 0 && c != 0) {
        return 0;
    }
    if(target[0] != 0 && target[1] != 0 && a / target[0] != b / target[1]) {
        return 0;
    }
    if(target[0] != 0 && target[2] != 0 && a / target[0] != c / target[2]) {
        return 0;
    }
    if(target[1] != 0 && target[2] != 0 && b / target[1] != c / target[2]) {
        return 0;
    }
    if(((int)a) % target[0] == 0) {
        return (int)(a / target[0]);
    }
    return 0;
}

int main() {
    FILE *fin = fopen("ratios.in", "r");
    FILE *fout = fopen("ratios.out", "w");
    fscanf(fin, "%d %d %d", &target[0], &target[1], &target[2]);
    for(int i = 0; i < 3; i++) {
        fscanf(fin, "%d %d %d", &feed[i][0], &feed[i][1], &feed[i][2]);
    }
    for(int all = 0; all < 298; all++) {
        /* 所有的饲料和 */
        for(int i = 0; i <= 99; i++) {
            /* Feed 1 */
            if(all - i < 0) {
                break;
            }
            for (int j = 0; j <= 99; j++) {
                /* Feed 2 */
                if(all - i - j < 0) {
                    break;
                }
                int k = all - i - j;
                int result = check(i, j, k);
                if(result) {
                    fprintf(fout, "%d %d %d %d\n", i, j, k, result);
                    return 0;
                }
            }
        }
    }
    fprintf(fout, "NONE\n");
    return 0;
}
Executing...
   Test 1: TEST OK [0.000 secs, 3180 KB]
   Test 2: TEST OK [0.000 secs, 3180 KB]
   Test 3: TEST OK [0.000 secs, 3180 KB]
   Test 4: TEST OK [0.108 secs, 3180 KB]
   Test 5: TEST OK [0.119 secs, 3180 KB]
   Test 6: TEST OK [0.086 secs, 3180 KB]
All tests OK.

Comments