算法复习——高斯消元(ssoi)

题目:

题目描述

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

输入  [复制]


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[105][105],ans[105];
int n;
int main()
{
  //freopen("a.in","r",stdin);
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n+1;j++)
      scanf("%lf",&map[i][j]);
  for(int i=1;i<=n;i++)
  {
    bool flag=false;
    if(!map[i][i])
    {
      for(int j=i+1;j<=n;j++)
        if(map[j][i])
        {
          flag=true;
          for(int k=i;k<=n+1;k++)
            swap(map[j][k],map[i][k]);
        }
      if(flag==false)  continue;
    }
    for(int j=i+1;j<=n;j++)
    {
      double temp=map[j][i]/map[i][i];
      for(int k=i;k<=n+1;k++)
        map[j][k]-=temp*map[i][k];
    }
  }
  for(int i=n;i>=1;i--)
  {
    ans[i]=map[i][n+1]/map[i][i];
    for(int j=i-1;j>=1;j--)
      map[j][n+1]-=map[j][i]*ans[i];
  }
  for(int i=1;i<=n;i++)
    cout<<(int)(ans[i]+0.5)<<‘ ‘;
  return 0;
}
时间: 2024-08-10 04:06:56

算法复习——高斯消元(ssoi)的相关文章

[算法模板]高斯消元

高斯消元用于求解线性方程. 贴一下代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define maxn 150 int n; double a[maxn][maxn]; using namespace std; void gau(){ for(int i=1;i<=n;i++){ int line=i; for(int j=i+1;j<=n

【算法】高斯消元&amp;线性代数

寒假作业~就把文章和题解3道题的代码扔在这里啦--链接: https://pan.baidu.com/s/1kWkGnxd 密码: bhh9 1.HNOI2013游走 #include <bits/stdc++.h> using namespace std; #define maxn 600 #define db double int n, m, degree[maxn]; db f[maxn][maxn], ans[maxn], fans; bool dis[maxn][maxn]; str

矩阵算法 高斯消元 行列式 矩阵的秩

今天学习一下矩阵的基本算法 高斯消元是解线性方程组的有力工具. 基本思想是通过将增广矩阵经过行初等变化变成简化阶梯形矩阵. 下面采用的是列主元高斯消元法,复杂度为O(n^3). 很容易根据高斯消元法的过程得出行列式和秩的算法. 代码: /********************************************************* * ------------------ * * author AbyssalFish * ***************************

【复习】高斯消元解图上期望概率

复习了一下高斯消元解图上期望概率,笔记的话,就直接去看SengXian的blog吧.BZOJ 1444 - [Jsoi2009]有趣的游戏见https://blog.sengxian.com/solutions/bzoj-1444 #include <cstdio> #include <cstring> #include <algorithm> const int N=11; char s[N*2]; int n,m,l,cnt,trans[N*N][N],id[N*N

HDU5088——Revenge of Nim II(高斯消元&amp;矩阵的秩)(BestCoder Round #16)

Revenge of Nim II Problem DescriptionNim is a mathematical game of strategy in which two players take turns removing objects from distinct heaps. On each turn, a player must remove at least one object, and may remove any number of objects provided th

高斯消元【转】

转载注明出处 高消一直是ACM中高层次经常用到的算法,虽然线性代数已经学过,但高消求解的问题模型及高消模板的应用变化是高消的最复杂之处. 先介绍一下高消的基本原理:引入互联网czyuan的帖子: 高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵. 高斯消元法的原理是: 若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. 所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解. 以上是线性代数课的回顾,

BZOJ 1013 [JSOI2008]球形空间产生器sphere 【高斯消元】

Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. HINT 1<=n<=10 提示:给出两个定义:1. 球心:到球面上任意一点距离都相等的点.2. 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 +

[ACM] POJ 2947 Widget Factory (高斯消元)

Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 4436   Accepted: 1502 Description The widget factory produces several different kinds of widgets. Each widget is carefully built by a skilled widgeteer. The time required to

线代之高斯消元

数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解.但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵.不过,如果有过百万条等式时,这个算法会十分省时.一些极大的方程组通常会用迭代法以及花式消元来解决.当用于一个矩阵时,高斯消元法会产生出一个"行梯阵式".高斯消元法可以用在电脑中来解决数千条等式及未知数.亦有一些方法特地用来解决一些有特别排列的系数的方程组. 2968: Lights  Time Limit(Common