高斯消元一

题目链接 : http://hihocoder.com/problemset/problem/1195?sid=1269842





很"好aoaoaoaoaoaoa"的高斯消元模板题

题意

多个方程组,要求:输出解、判无解、判多解

保证方程解非负

做法

第一点注意

首先要会高斯消元(废话)

然后还要卡精度

所以一定要用eps卡精度

这是第一点

第二点注意

然后就是最恶心的:判无解多解

我们先明确一点:无解优先级大于多解

什么意思呢?

对于一个方程,我们要先检查无解,再检查多解

明白这一点之后,咱们继续。

第三点注意

无解怎么判断?

如果 方程系数都等于0并且结果大于 0 则无解(因为题目保证解是非负数)

(形如 x × 0 = y , x × -1 = y | x>0 && y>0,肯定无解)

第四点注意

如何判断多解?

如果在消元过程中,某一列都被消成了0,并且保证该方程有解,那么这个方程是多解的。

为什么呢?

因为如果一个未知数上的系数都是0,那么这个未知数有无穷多种取法,所以方程就有多组解了。

第五点注意

如果你发现有多解,但是不确定是不是无解怎么办?

如果在最后用倒三角求未知数的值时

我们求到一个未知数的系数为0

但是它的值不为0的时候

那么它就是无解的

反之就是多解的

总结

综上所述 这道题是"不折不扣"的"模板题"

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define rg register int
#define ll long long
#define RG register
#define il inline
using namespace std; il int gi()
{
rg x=0,o=0;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||'9'<ch)) ch=getchar();
if(ch=='-') o=1,ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return o?-x:x;
} int n,m;
#define db double
db x[1001],fc[1001][501]; il int gauss()
{
RG bool flg=0;
for(rg now,k=1; k<=n; ++k)
{
now=k;
for(rg i=k+1; i<=m; ++i)
if(fabs(fc[i][k])>fabs(fc[now][k]))
now=i;
if(now==k && fabs(fc[k][k])<1e-7)
{
flg=1;
continue;
}
if(now!=k) swap(fc[now],fc[k]);
for(rg i=k+1; i<=n+1; ++i) fc[k][i]/=fc[k][k];fc[k][k]=1;
for(rg i=k+1; i<=m; ++i)
{
for(rg j=k+1; j<=n+1; ++j)
fc[i][j]-=fc[i][k]*fc[k][j];
fc[i][k]=0;
}
}
for(rg j,i=1; i<=m; ++i)
{
for(j=1; j<=n; ++j)
if(fabs(fc[i][j])>1e-6)
break;
if(j==n+1 && fabs(fc[i][n+1])>1e-6) return 0; // 如果 方程系数小于0并且结果大于 0 则无解
}
for(rg i=n; i>=1; --i)
{
for(rg j=i+1; j<=n; ++j) fc[i][n+1]-=fc[i][j]*fc[j][n+1];
if(fc[i][n+1] && !fc[i][i] ) return 0;
}
if(flg) return -1;
return 1;
}
int main()
{
n=gi(),m=gi();
for(rg i=1; i<=m; ++i)
for(rg j=1; j<=n+1; ++j)
scanf("%lf",&fc[i][j]);
rg ans=gauss();
if(ans==-1) puts("Many solutions");
else if(ans==0) puts("No solutions");
else for(rg i=1; i<=n; ++i) printf("%d\n",(int)(fc[i][n+1]+0.5));
return 0;
}

[hihoCoder] 高斯消元·一 [TPLY]的更多相关文章

  1. HihoCoder 1195 高斯消元·一(高斯消元)

    题意 https://hihocoder.com/problemset/problem/1195 思路 高斯消元是解决高元方程的一种算法,复杂度 \(O(n^3)\) . 过程大致是: 构造一个未知数 ...

  2. hihocoder 第五十二周 高斯消元·二【高斯消元解异或方程 难点【模板】】

    题目地址:http://hihocoder.com/contest/hiho57/problem/1 输入 第1..5行:1个长度为6的字符串,表示该行的格子状态,1表示该格子是亮着的,0表示该格子是 ...

  3. hihoCoder 1196 高斯消元·二

    Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...

  4. hihocoder 1196 高斯消元.二

    传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其他的活动. 店主:买了 ...

  5. hihoCoder 1195 高斯消元.一

    传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:喂不得了啦,那边便利店的薯片半价了! 小Hi:啥?! 小Ho:那边的便利店在打折促销啊. 小Hi:走走走, ...

  6. hihoCoder #1195 高斯消元·一

    题意:便利店老板为了促销,推出了组合包的形式,将不同数量的各类商品打包成一个组合.比如2袋薯片,1听可乐的组合只要5元,而1袋薯片,2听可乐的组合只要4元.通过询问老板知道:一共有N种不同的商品和M种 ...

  7. hihocoder图像算子(高斯消元)

    描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效果. 假设原图为H × W的矩阵A,算子矩阵为D × D的矩阵Op,则处理后的矩阵B大小为(H-D+1) × ...

  8. hihoCoder#1196 : 高斯消元·二(开关灯问题)

    传送门 高斯消元解异或方程组 小Ho在游戏板上忙碌了30分钟,任然没有办法完成,于是他只好求助于小Hi. 小Ho:小Hi,这次又该怎么办呢? 小Hi:让我们来分析一下吧. 首先对于每一个格子的状态,可 ...

  9. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

随机推荐

  1. tcp_sync_server and tcp_sync_client

    #include <iostream> #include <fstream> #include <sstream> #include <boost/asio. ...

  2. 好用的Google漏洞爬虫:Google Mass Explorer

    这是一款基于谷歌搜索引擎的自动化爬虫. 爬虫介绍 爬虫大体机制就是: 先进行一次谷歌搜索,将结果解析为特定格式,然后再提供给exp使用. 大家可以尝试使用–help来列出所有参数. 这个项目笔者会持续 ...

  3. 启动MySql提示:The server quit without updating PID file(…)失败

    1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限解决方法 :给予权限,执行 "chown -R mysql:mysql /var/data" ...

  4. iperf命令

    iperf命令网络测试 iperf命令是一个网络性能测试工具.iperf可以测试TCP和UDP带宽质量.iperf可以测量最大TCP带宽,具有多种参数和UDP特性.iperf可以报告带宽,延迟抖动和数 ...

  5. 使用VNC+SSH建立安全的远程桌面访问WINDOWS服务器

    用了一段时间的MONO,现在MONO也支持了ENTITY FRAMEWORK 6.但是实际上在LINUX环境里用MYSQL还是会有很多坑.并且之前在网络游戏服务端SCUT上扩展一些功能时候也遇到了一些 ...

  6. C++ 函数模板“偏特化”

         模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型 ...

  7. Mac下PyCharm快捷键大全

    Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...

  8. unbuntu 系统登录华南师范大学校园网的方法

    最近刚装了unbuntu 系统,刚开始网络连接遇到了点小问题,原来是校园网不知道怎么认证,于是向好基友请教了下,得出快捷的方法如下: 下载学校网络的认证客户端,记住位置,一般都是默认下载地址是 Dow ...

  9. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  10. ARM平台的虚拟化介绍

    本篇博文主要介绍虚拟化的基本思想以及在arm平台如何做虚拟化,arm提供的硬件feature等等. 虚拟化技术简介 虚拟化技术 虚拟化是一个概念,单从这个概念的角度来看,只要是用某一种物品去模拟另一种 ...