USACO Feed Ratios

  这题就是经典的配饲料, 由于最多配比是100因此可以用暴力解决法, 注意下mod 0的处理, 代码如下:

/*
    ID: m1500293
    LANG: C++
    PROG: ratios
*/

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

using namespace std;
int si[10];
int a[10][10];
int res[10], sum;

void deal(int ii, int jj, int kk)
{
    int now[5];
    now[0] = ii*a[0][0] + jj*a[1][0] + kk*a[2][0];
    now[1] = ii*a[0][1] + jj*a[1][1] + kk*a[2][1];
    now[2] = ii*a[0][2] + jj*a[1][2] + kk*a[2][2];
    for(int i=0; i<3; i++)
        if(si[i]==0 && now[i]!=0) return ;
    int div[5], len=0;
    for(int i=0; i<3; i++)
    {
        if(si[i]==0) continue;
        if(now[i]%si[i]!=0) return;
        div[len++] = now[i]/si[i];
    }
    for(int i=1; i<len; i++)
    if(div[i]!=div[i-1]) return;
    int sm = ii+jj+kk;
    if(sm<sum)
    {
        sum = sm;
        res[0]=ii; res[1]=jj; res[2]=kk; res[3]=div[0];
    }
}

int main()
{
    freopen("ratios.in", "r", stdin);
    freopen("ratios.out", "w", stdout);
    scanf("%d%d%d", &si[0], &si[1], &si[2]);
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            scanf("%d", &a[i][j]);
    sum = 0x3fffffff;
    for(int i=0; i<=100; i++)
    for(int j=0; j<=100; j++)
    for(int k=0; k<=100; k++)
    {
        if(i==0 && j==0 && k==0) continue;
        if(i==8 && j==1 && k==5)
        {
            int t;
            t = 0;
        }
        deal(i, j, k);
    }
    if(sum == 0x3fffffff)
        printf("NONE\n");
    else
        printf("%d %d %d %d\n", res[0], res[1], res[2], res[3]);
    return 0;
}

 

posted @ 2015-12-28 21:18  xing-xing  阅读(213)  评论(0编辑  收藏  举报