速战高斯消元

A:高斯消元,这难吗?

Q:不难,只要你会线性代数初等变换

A:没去学过?。。

Q:上B站看大神讲解,去上网易公开课,看百度,买本书自己啃……

 

前面都是为了鼓励你们自我学习所说的肺()腑()之言,当然这没有这么高大上

也不需要许多前置知识,只要你会十分水()的如何加减消元和代入消元(想当年我初中就这两个名词没写出来被扣了分。。

 

如何n个方程的解呢?

其实很简单,只需要用分治的思想

首先,n个未知数n的方程,把n-1个方程中的某个未知数用加减消元法消去,

问题就变成了n-1个方程n-1个未知数(降维打击),不就完事了吗?

然后再倒着进行代入消元法

时间O (n^{3}),愉快的结束了!!!

A:呵呵呵,怎么这么水?

Q:ORZ,大佬!

 

好了,根据传()统(B)的说法,这是维护一个上三角矩阵
维护完了以后再倒着做一遍

WOW,这也太难()了,你们还是自己啃书吧!

说真的,小学生都会了(我还不如小学生!

 

模板题

#include<cstdio>
#include<iostream>
#include<cmath> 
#define db double 
const db eps=1e-5;
using namespace std;

const int N=106;
int n;
db a[N][N],ans[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	for(int i=1;i<=n;i++)
	{
		if(abs(a[i][i])<=eps) 
		{
			bool f=0;
			for(int j=i+1;j<=n;j++)
				if(abs(a[j][i])>eps)
				{
					for(int k=i;k<=n+1;k++)
						swap(a[i][k],a[j][k]);
					f=1;
					break;
				}
			if(f==0)
			{
				puts("No Solution");
				return 0;
			} 
		}
		for(int j=i+1;j<=n;j++)
		{
			db b=a[i][i]/a[j][i];
			a[j][i]=0;
			for(int k=i+1;k<=n+1;k++) 
				a[j][k]=a[j][k]*b-a[i][k];
		}
	}
	for(int i=n;i>=1;i--)
	{
		ans[i]=a[i][n+1];
		for(int j=i+1;j<=n;j++)
			ans[i]-=a[i][j]*ans[j];
		ans[i]/=a[i][i];
	}
	for(int i=1;i<=n;i++)
		printf("%.2lf\n",ans[i]);
	return 0;
 } 

[SDOI2006]线性方程组

这同样是一道模板题

特别特别特别特别的快(恶)乐(心),比遇见风男还快乐

我们机房目前还没有一遍过的大佬。。

但不得不说这是到非常优秀的模板题,比Luogu上的模板题好无数倍

主要是他恶心恶心恶心再要判有无解,他的数据又灰常强势。

#include<cstdio>
#include<cmath>
#include<iostream>
#define db double
const db eps=1e-5;
using namespace std;

const int N=105;
int n,now;
bool f,ff;
db a[N][N],ans[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	now=1; //now 记录现在的消到了第几位 
	ff=0; 
	//判断是否有无解或者多解;
	//因为无解意味着必定会消到 0+0+0+0+……+0=c(c!=0)
	//多解意味着会消到0+0+0+……+0=0 
	for(int i=1;i<=n;i++)
	{
		f=0;
		while(now<=n&&abs(a[i][now])<=eps)
		{
			for(int j=i+1;j<=n;j++)
				if(abs(a[j][now])>eps) 
				{
					for(int k=now;k<=n+1;k++)	
						swap(a[i][k],a[j][k]);
					f=1;
					break;
				}
			if(f==0) 
			{
				now++;
				ff=1;  
			}
		}
		if(now>n) break;
		for(int j=i+1;j<=n;j++)
			if(abs(a[j][now])>eps) 
			{
				double b=a[i][now]/a[j][now];
				a[j][now]=0;
				for(int k=now+1;k<=n+1;k++)
					a[j][k]=a[j][k]*b-a[i][k];
			}
		now++;
		if(now>n) break;
	}
	if(ff==1)
	{ 
		for(int i=n;i;i--)
		{
			bool fff=0;
			for(int j=1;j<=n;j++)
				if(abs(a[i][j])>eps) 
				{
					fff=1;
					break;
				} 
			if(fff==1) break;
			//前面系数全是0 
			if(abs(a[i][n+1])>eps)
			{
				puts("-1");
				return 0;  
			} //判断无解
		//无解必须在前面判断,因为无解可能出现0+0+0+……+0=0; 
		}
		puts("0");
		return 0; 
	}
	for(int i=n;i;i--)
	{
		ans[i]=a[i][n+1];
		for(int j=i+1;j<=n;j++)
			ans[i]-=a[i][j]*ans[j];
		ans[i]/=a[i][i];
	}
	for(int i=1;i<=n;i++)
		printf("x%d=%.2lf\n",i,ans[i]);
	return 0;
}

 

[JSOI2008]球形空间产生器

很水的高斯消元,很容易写出n+1个方程

这些方程都带着平方,是不是感觉好恶(快)心(乐)?

每个方程与第一个相减,即可得到n个可以高斯消元的方程

如当n=2时,设球心为(x,y),即可得到

x(2x_2-2x_1)+y(2y_2-2y_1)=x_2^{2} -x_1^{2}+y_2^{2}-y_1^{2}

x(2x_3-2x_1)+y(2y_3-2y_1)=x_3^{2} -x_1^{2}+y_3^{2}-y_1^{2}

同理类推

#include<cstdio>
#include<iostream>
#include<cmath>
#define db double
const db eps=1e-6;
using namespace std;

const int N=20;
int n;
db b[N][N],a[N][N],ans[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;i++)
		for(int j=1;j<=n;j++)
			scanf("%lf",&b[i][j]);
	 for(int i=1;i<=n;i++)
	 	for(int j=1;j<=n;j++)
	 	{
	 		a[i][j]=(b[i+1][j]-b[1][j])*2;
	 		a[i][n+1]+=b[i+1][j]*b[i+1][j]-b[1][j]*b[1][j];
	 	}
	 for(int i=1;i<=n;i++)
	 {
		if(abs(a[i][i])<=eps)
			for(int j=i+1;j<=n;j++)
			{
				if(abs(a[j][i])>eps)
				{
					for(int k=i;k<=n+1;k++)
						swap(a[i][k],a[j][k]);
				}
				break;
			}
		for(int j=i+1;j<=n;j++)
			if(abs(a[j][i])>eps)
			{
				db t=a[i][i]/a[j][i];
				a[j][i]=0;
				for(int k=i+1;k<=n+1;k++)
					a[j][k]=a[j][k]*t-a[i][k];
			}
	 }
	 for(int i=n;i>=1;i--)
	 {
	 	ans[i]=a[i][n+1];
	 	for(int j=i+1;j<=n;j++)
	 		ans[i]-=ans[j]*a[i][j];
	 	ans[i]/=a[i][i];
	 }
	 for(int i=1;i<=n;i++)
	 	printf("%.3lf%c",abs(ans[i])<=eps?0.0:ans[i],i==n?'\n':' ');
	 return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值