傳送門傳送門
傳送門傳送門
例1:看似是乙個高斯消元,但普通的程式交上去會被卡成80
8080
分w awa
wa。我們看下面的一組hack資料:
2
0 2 3
0 0 0
化簡2y+
3=0,
0=
02y+3=0,0=0
2y+3=0
,0=0
易得該方程組有無數解,但是我們的程式會輸出−1-1
−1。究其原因,我們在考慮第乙個方程時有f[1
][1]
=0,f
[1][
3]≠0
f[1][1]=0,f[1][3]≠0
f[1][1
]=0,
f[1]
[3]
=0,程式直接判斷無解退出。
所以我們在排序時,我們應該將第一關鍵字大的排前面,第二關鍵字小的排前面,這樣就可以避免這種情況的發生。
一些細節處理見**:
#include
#define eps 1e-6
using
namespace std;
double a[
105]
[105];
int flag1,flag2;
int n;
double
check
(double x)
bool
cmp(
int k,
int x,
int y)
}int
main()
}for
(int i=
1;i<=n;i++)}
for(
int j=
1;j<=n+
1;j++)if
(!check
(a[i]
[i])
)for
(int j=
1;j<=n;j++)}
}for
(int i=
1;i<=n;i++)}
for(
int i=
1;i<=n;i++)}
for(
int i=
1;i<=n;i++
)}
例2
設中心點座標為(x1
,x2,
...,
xn
)(x_1,x_2,...,x_n)
(x1,x
2,.
..,x
n),依照題意列出n+1
n+1n+
1個方程,上下兩方程相減得出n
nn個方程,有n
nn個未知數,高斯消元求解即可。
#include
using
namespace std;
int n;
double p[15]
[15],a[15]
[15];
intmain()
}for
(int i=
1;i<=n;i++)}
for(
int i=
1;i<=n;i++)}
for(
int j=
1;j<=n+
1;j++
)for
(int j=
1;j<=n;j++)}
}for
(int i=
1;i<=n;i++
)}
例3
列舉刪掉的方程,由剩餘的方程聯立求解即可。
注意判斷浮點數及是否有唯一解。
#include
using
namespace std;
double a[
105]
[105
],b[
105]
[105
],w[
105]
;int flag=
0,m[
105]
,f[105][
105]
,n,num,k,x;
intsolve()
for(
int j=
1;j<=n+
1;j++)if
(!a[i]
[i])
return0;
for(
int j=
1;j<=n;j++)}
}int maxn=-1
,num=0;
for(
int i=
1;i<=n;i++
)for
(int i=
1;i<=n;i++)}
return num;
}int
main()
scanf
("%lf"
,&b[i]
[n+1])
;}for(
int i=
1;i<=n+
1;i++)}
swap
(b[i]
,b[n+1]
);num=
solve()
;if(num)
flag=num;}}
if(!flag)
else cout<}
高斯消元 浮點高斯消元
浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...
矩陣消元 高斯消元
安利一波高斯消元的部落格,內容很詳細。看完這個相信你已經理解了大概,高斯消元求線性方程組,在學習線性代數 大學課程 的時候我們都接觸過。原理是先把執行緒組轉換成矩陣,然後把它等價變換成上三角矩陣,這樣從下到上依次可以求出解集。高斯消元模板 模板題 include define n 205 using...
第三講 高斯消元法
gauss消元法的步驟 1 若方程組的第乙個主元位置為 0 則交換方程以得到第乙個主元 2 用第乙個方程的倍數消去第乙個主元下方所有係數 3 確定第二個主元,繼續以上消元過程 4 最後得到含乙個未知量的方程,回代得方程組的解.n 個方程有 n 個主元 leftrightarrow 方程組有唯一解。消...