您的位置:首页 > Web前端

USACO-Feed Ratios(克拉默法则求线性方程组的解)

2017-03-17 18:59 459 查看
一个ppt

题目可以转换成这个:

给定一个 n∗n 矩阵 A ,和一个 n 维列向量 b ,求一个 n 维列向量 a 和一个常数 k 。

使得 A∗a=k∗b ,且 ∑ni=1k∗bi 最小。

然后我们可以从1到100枚举k。

然后求每一个解。

求方程解可以使用克拉默法则。即: xj=Dj/D 。

D 是原矩阵的行列式,Dj 是用 bi替代Dij 后矩阵的行列式。

若 D 为0,则代表无解,如果 xj 是小数或是负数,则不满足题意,同样无解。

/*
ID: xdujlx1
PROG: ratios
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
int b[3];
int A[3][3];
void ioinit()
{
freopen("ratios.in","r",stdin);
freopen("ratios.out","w",stdout);
}
int det(int C[][3])
{
int res=1;
for(int i=0;i<3;i++)
{
for(int j=i+1;j<3;j++)
{
while(C[j][i])
{
int t=C[i][i]/C[j][i];
for(int k=i;k<3;k++)
{
C[i][k]-=C[j][k]*t;
swap(C[i][k],C[j][k]);
}
res=-res;
}
}
if(C[i][i]==0) return 0;
res*=C[i][i];
}
return res;
}
int main()
{
ioinit();
int C[3][3];
cin>>b[0]>>b[1]>>b[2];
for(int j=0;j<3;j++)
for(int i=0;i<3;i++)
cin>>A[i][j];
memcpy(C,A,sizeof(A));
int x=det(C);
if(x==0)
{
puts("NONE");
return 0;
}
int ans=1;
int a[3];
for(;ans<100;ans++)
{
int i;
for(i=0;i<3;i++)
{
memcpy(C,A,sizeof(A));
for(int j=0;j<3;j++)
C[j][i]=ans*b[j];
int y=det(C);
if((x<0&&y>0)||(x>0&&y<0)||y%x) break;
a[i]=y/x;
}
if(i==3) break;
}
if(ans==100) puts("NONE");
else printf("%d %d %d %d\n",a[0],a[1],a[2],ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: