算法复习——高斯消元(ssoi)
2024-08-30 09:29:13
题目:
题目描述
Tom 是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于下面这样的方程组就束手无策了。
x+y=3
x-y=1
于是他要你来帮忙。给定一个线性多元一次方程组,请你求出所有未知数的解。
保证在 int 范围内可以处理所有问题。
输入格式
输入文件的第一行一个数字 N(1≤N≤100),表示给定的方程组中的未知数的个数,同时也是这个方程组含有的方程个数。
第 2 到 N+1 行,每行 N+1 个数。每行的前 N 个数表示第 1 到 N 个未知数的系数。第 N+1 个数表示 N 个未知数乘以各自系数后再相加的和。
输出格式
输出一行,有 N 个整数,表示第 1 到 N 个未知数的值(整数解),而且数据保证有整数解。
样例数据 1
输入 [复制]
2
1 1 3
1 -1 1
输出
2 1
题解:
高斯消元模板题,具体过程见:http://jingyan.baidu.com/album/39810a23e40c80b636fda63a.html?picindex=1
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
double map[][],ans[];
int n;
int main()
{
//freopen("a.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n+;j++)
scanf("%lf",&map[i][j]);
for(int i=;i<=n;i++)
{
bool flag=false;
if(!map[i][i])
{
for(int j=i+;j<=n;j++)
if(map[j][i])
{
flag=true;
for(int k=i;k<=n+;k++)
swap(map[j][k],map[i][k]);
}
if(flag==false) continue;
}
for(int j=i+;j<=n;j++)
{
double temp=map[j][i]/map[i][i];
for(int k=i;k<=n+;k++)
map[j][k]-=temp*map[i][k];
}
}
for(int i=n;i>=;i--)
{
ans[i]=map[i][n+]/map[i][i];
for(int j=i-;j>=;j--)
map[j][n+]-=map[j][i]*ans[i];
}
for(int i=;i<=n;i++)
cout<<(int)(ans[i]+0.5)<<' ';
return ;
}
最新文章
- bzoj1458 士兵占领
- [转载]理解HTML语义化
- Unity原生渲染方案
- linux modprobe命令参数及用法详解--linux加载模块命令
- Linux下C/C++程序开发管理(makefile)
- 在KALI LINUX中安装JAVA JDK
- SVN创建分支
- BZOJ 2431: [HAOI2009]逆序对数列( dp )
- Python处理Excel(转载)
- APP测试--测试日报和上线报告
- CodeForces758D
- 处理eclipse启动时报java.lang.IllegalStateException
- tp5 $_ENV获取不到数据
- mysql相关碎碎念
- python之正则表达式及RE模块
- linux中使用nfs共享文件
- 步步为营-11-List<;T>;泛型的简单练习
- 将浏览器的内容复制到Linux的文件里面
- resource not found : rosbridge_server
- JVM内存模型 小小结