解方程

作者: madao756 | 来源:发表于2020-07-28 23:03 被阅读0次

复习一下解方程

0X00 解线性方程

用「高斯消元法」解线性方程

面试题 16.03. 交点

883. 高斯消元解线性方程组

过程都写注释里面了,想一次写对真的挺难的

def gauss(n, mat):
    eps, r = 1e-6, 0
    for c in range(n):
        # 找出该列的绝对值最大值
        t = r
        for i in range(r+1, n, 1):
            if abs(mat[i][c]) > abs(mat[t][c]): t = i
        # 把最大列所属的那一行交换到 r 行上,初等行变换
        mat[t], mat[r] = mat[r], mat[t]
        # 如果该列全为 0 则跳过这一列
        if abs(mat[r][c]) < eps: continue

        # 将所有数除以第一个数
        for i in range(n, c-1, -1): mat[r][i] /= mat[r][c]
        # 将下面所有的数字变为 0
        for i in range(r+1, n, 1):
            if abs(mat[i][c]) < eps: continue
            for j in range(n, c-1, -1):
                mat[i][j] -= mat[i][c] * mat[r][j]
        r += 1
    if r < n:
        for i in range(n-1, r-1, -1):
            if abs(mat[i][-1]) > eps: return 2
        return 1
    
    for i in range(n-1, -1, -1):
        for j in range(n-1, i, -1):
            mat[i][-1] -= mat[i][j] * mat[j][-1]
    return 0
t = gauss(n, mat)
if t == 0:
    for i in range(n): print("{:.2f}".format(mat[i][-1]))
elif t == 1:
    print("Infinite group solutions")
else:
    print("No solution")

与此相同的还有解异或线性方程

884. 高斯消元解异或线性方程组 基本一模一样

def gauss():
    r = 0
    for c in range(n):
        # print(a)
        t = -1
        for i in range(r, n):
            if a[i][c] == 1:
                t = i
                break
        # print(r, t, a[t][c])
        if t == -1: continue
        a[t], a[r] = a[r], a[t]
        
        for i in range(r+1, n):
            if not a[i][c]: continue
            for j in range(c, n+1):
                a[i][j] ^= a[r][j]
        r += 1
        
    if r < n:
        for i in range(r, n):
            if a[i][-1]: return 2
        return 1
    
    for i in range(n-1, -1, -1):
        for j in range(i+1, n):
            a[i][n] ^= a[i][j] * a[j][n]
    
    return 0

0X01 解不等式

可以用图论的方法解不等式,假设有 a, b 两个非负整数。无非就是以下五种情况

  • a == b
  • a > b
  • a \ge b
  • a < b
  • a \le b

放在图论中,我们有节点 a, b 如果有一条从 a 指向 b 的权重为 1 的边。那么就有 dist[b] > dist[a] + 1,如果有一条权重为 0 的边那么就有 dist[b] \ge dist[a]。

因此,我们只需把不等式放在图论中,并建立一个虚拟原点,就能求出所有值的最大或最小值。比如这个题目:

1169. 糖果

求至少,就是求距离最大。举个例子有两个合法的不等式: a > b 和 a \ge b 我们最终取的也是 a > b。所以在计算距离的时候取的是最大值。

利用 spfa 计算所有点距离虚拟原点的距离。

def spfa(start):
    dist = [float("-inf")] * (1+n)
    dist[start] = 0
    st = [False] * (1+n)
    st[start] = True
    q = [start]
    cnt = [0] * (1+n)
    while q:
        v1 = q.pop()
        st[v1] = False
        for v2, w in g[v1]:
            if dist[v2] < dist[v1] + w:
                dist[v2] = dist[v1] + w
                cnt[v2] = cnt[v1] + 1
                if cnt[v2] >= n+1:
                    print(-1)
                    return
                if not st[v2]:
                    q.append(v2)
                    st[v2] = True
    # print(dist)
    print(sum(dist))

相关文章

  • [生活日记]王雅婕《解方程》

    2020年12月3日 星期四 阴解方程祁门县实验学校502班王雅婕 最近我们学习了解方程, 解方程不是很难。...

  • 使用 Python 解高数上习题

    准备 安装 sympy 库: sudo pip install sympy 变量声明 解方程及方程组 解方程 例:...

  • 学虎七上数学期末复习打卡第24天

    解方程练习1

  • 解方程

    定义符号 等同于 解多元一次方程组 符号化 解方程 matlab自动认未知数,按26各英文字母排列,以距离x的远近...

  • 解方程

    复习一下解方程 0X00 解线性方程 用「高斯消元法」解线性方程 面试题 16.03. 交点 883. 高斯消元解...

  • 解方程

  • 解方程

    上周五开始,我们学习解方程。 本单元也是这本书的重难点内容,我知道学生学习起来肯定比较困难,但真...

  • 解方程

    今天晚上翔做完了数学老师布置的选做题,都是和差问题,5个题全部作对,速度挺快的,没有画线段图就做出来了,比起去年做...

  • 解方程

    今日没有进新课,因为我在备课的时候突然想:如果我不能在解加减法时把格式定理让孩子明白,那么以后学的任何东西都可能是...

  • 解方程

    生活就是一道道方程式。随着年纪的增长,方程式也越来越难解。甚至一度陷入无解。 彷徨,怀疑,伤心,气急败坏,都是必经...

网友评论

      本文标题:解方程

      本文链接:https://www.haomeiwen.com/subject/cphcrktx.html