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 是小数或是负数,则不满足题意,同样无解。
题目可以转换成这个:
给定一个 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; }
相关文章推荐
- USACO Feed Ratios, 解线性方程组,克莱姆法则,0取余
- USACO-Section3.2 Feed Ratios【克莱默法则】
- USACO3.2.4 Feed Ratios (ratios)
- USACO Section 3.2 Feed Ratios(解三元一次方程)
- 【搜索】【USACO】Feed Ratios
- USACO section 3.2 Feed Ratios(高斯定理)
- usaco Feed Ratios
- USACO3.2.4--Feed Ratios
- USACO3.24Feed Ratios
- [USACO3.2.4 Feed Ratios]
- USACO Feed Ratios
- USACO 3.2 Feed Ratios (ratios)
- USACO 3.2.4 feed ratios
- USACO 3.2.4 Feed Ratios
- usaco Feed Ratios
- 【USACO题库】3.2.4 Feed Ratios饲料调配
- [USACO3.2]饲料调配 Feed Ratios
- USACO3.2.4 Feed Ratios (ratios)
- usaco3.2.4 Feed Ratios
- USACO--3.2Feed Ratios