usaco3.2.5饲料调配

来源:互联网 发布:c语言中乘方怎么表示 编辑:程序博客网 时间:2024/04/27 17:53

这题听说可以用行列式,但我不会。

这题范围比较小,所以一个一个试过去吧。但个人比较喜欢从总数最小开始,再搜。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
int s[5][5],s1[4];
bool flag[4];
bool flag1;
int main()
{
    //freopen("ratios.in","r",stdin);
    //freopen("ratios.out","w",stdout);
   for(int i=0;i<=3;i++)
    for(int j=1;j<=3;j++)
    cin>>s[i][j];
   for(int i=1;i<=3;i++)
    if(s[0][i]==0)flag[i]=true;
   for(int n=1;n<=300;n++){
    for(int i=0;i<=n&&i<=100;i++){
        int n1=n-i;
        for(int j=0;j<=n1&&j<=100;j++){
            int n2=n1-j;
            flag1=false;
            for(int k=1;k<=3;k++)
            {
                s1[k]=s[1][k]*i+s[2][k]*j+s[3][k]*n2;
                if(flag[k]&&s1[k]!=0)flag1=true;
            }
            if(!flag1)
            if((flag[1]||(s1[1])%s[0][1]==0)&&(flag[2]||(s1[2])%s[0][2]==0)&&(flag[3]||(s1[3])%s[0][3]==0)){
                int n3,kk;
                for(kk=1;kk<=3;kk++){
                    if(flag[kk])continue;
                    n3=(s1[kk])/s[0][kk];
                    break;
                }
                if(kk==3){cout<<i<<" "<<j<<" "<<n2<<" "<<n3<<endl;
                    return 0;}
                for(int kkk=kk+1;kkk<=3;kkk++)
                {if(flag[kkk]||n3==(s1[kkk])/s[0][kkk]);
                  else break;
                     if(kkk==3){cout<<i<<" "<<j<<" "<<n2<<" "<<n3<<endl;
                    return 0;}
                }


            }
        }
    }
   }
   cout<<"NONE"<<endl;
return 0;
}
0 0
原创粉丝点击