Luogu P5027 【Barracuda】(高斯消元)
祭一下第一道独立做出来的高斯消元(虽然在各大佬看来都是水题...)
首先这道题给了你n+1个一次方程,n个未知数
其中有一个方程是错误的
求解在合法的前提下最大的未知数是多少...
显然高斯消元...
关注到\(n≤100\)所以\(n^4\)的算法是极限
高斯消元复杂度是\(n^3\)所以我们可以暴力枚举那个方程是错误的
之后判断合法性即可...
总之也不是很难啊,关键是不要忘记illegal...刚开始程序末尾的illegal忘了然后就Subtask2 WA了一个点...
直接看代码直观一点呢
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=0,f=1;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
return ans*f;
}void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}const double eps=1e-11;
int n,w[105],p[105][105],tot,ANS,lst[105],lst_ans;
double a[105][105],ans[105];
inline void cmax(int &a,int b){if(a<b) a=b;}
inline void Gauss(){//高斯消元+回代
for(int maxn,i=1;i<=n;i++){
maxn=i;
for(int j=i+1;j<=n;j++) if(fabs(a[maxn][i])<fabs(a[j][i])) maxn=j;
swap(a[maxn],a[i]);
double div=a[i][i];
for(int j=i;j<=n;j++) a[i][j]/=div;
for(int j=i+1;j<=n;j++){
div=a[j][i];
for(int k=i;k<=n+1;k++) a[j][k]-=div*a[i][k];
}
}ans[n]=a[n][n+1];
for(int i=n-1;i>=1;--i){
ans[i]=a[i][n+1];
for(int j=i+1;j<=n;j++)
ans[i]-=a[i][j]*ans[j];
}
}
int main(){
n=read();
for(int i=1,t;i<=n+1;i++){
t=p[i][0]=read();
for(int j=1;j<=t;j++) p[i][j]=read();
w[i]=read();
}int ppp=0;
for(int wr=1;wr<=n+1;wr++){//第wr(ong)次出现错误答案
tot=0;memset(a,0,sizeof(a));
for(int i=1;i<=n+1;i++)
if(i!=wr){
++tot,a[tot][n+1]=w[i];
for(int j=1;j<=p[i][0];j++)a[tot][p[i][j]]=1;
}
Gauss();//构造方程+高斯消元
//------------------------------------------------------------------------
ANS=0;tot=0;int ff=0;
for(int i=1;i<=n;i++){
int flag=0;
for(int j=1;j<=n;j++)
if(fabs(a[i][j])>eps) flag=1;
if(flag==0) {ff=1;break;}
}if(ff) continue;//检查1_唯一解
//------------------------------------------------------------------------
for(int i=1;i<=n;i++)
if(fabs(ans[i]-(int)ans[i])<eps&&ans[i]>0)
lst[i]=(int)ans[i];
else {ff=1;break;}//检查2_整数
if(ff) continue;
for(int i=1;i<=n;i++) cmax(ANS,lst[i]);
for(int i=1;i<=n;i++) if(ans[i]==ANS) ++tot,ff=i;//检查3_最大值唯一
if(tot>1) continue;
//------------------------------------------------------------------------
if(ppp){puts("illegal");return 0;}//多种可能方案
lst_ans=ff;ppp=1;
}
if(!ppp) puts("illegal");//没有可能方案
else writeln(lst_ans);
return 0;
}
Luogu P5027 【Barracuda】(高斯消元)的更多相关文章
- 【Luogu】P3389高斯消元模板(矩阵高斯消元)
题目链接 高斯消元其实是个大模拟qwq 所以就着代码食用 首先我们读入 ;i<=n;++i) ;j<=n+;++j) scanf("%lf",&s[i][j]) ...
- luogu P2962 [USACO09NOV]灯Lights 高斯消元
目录 题目链接 题解 题目链接 luogu P2962 [USACO09NOV]灯Lights 题解 可以折半搜索 map合并 复杂度 2^(n / 2)*logn 高斯消元后得到每个点的翻转状态 爆 ...
- Luogu P3389 高斯消元
https://www.luogu.com.cn/problem/P3389 主元消元法[模板] 高斯消元是解决多元线性方程组的方法,再学习它之前,先引入一个东西--行列式 行列式的性质: 这里我们只 ...
- 【Luogu】P3211XOR和路径(高斯消元)
题目链接 唉我个ZZ…… 首先考虑到异或是可以每一位分开算的 好的以后再碰见位运算题我一定先往按位开车上想 然后设f[i]为从i点出发到终点是1的概率 高斯消元解方程组即可. #include< ...
- 【Luogu】P4035球形空间产生器(高斯消元)
题目链接 水比题,把圆方程展开减一下把平方都减掉半径的平方也减掉,高斯消元即可. 然后我只输出两位小数,爆了两次零.我好菜啊. #include<cstdio> #include<c ...
- 【Luogu】P2447外星千足虫(高斯消元)
题目链接 高斯消元解%2意义下的方程,Bitset优化一下. 在消的过程中就能顺便把有解的第一问求出来,记录一下访问过的最大行. #include<cstdio> #include< ...
- 【Luogu】P3317重建(高斯消元+矩阵树定理)
题目链接 因为这个专门跑去学了矩阵树定理和高斯消元qwq 不过不是很懂.所以这里只放题解 玫葵之蝶的题解 某未知dalao的矩阵树定理 代码 #include<cstdio> #inclu ...
- Luogu P2447 [SDOI2010]外星千足虫 高斯消元
链接 给出的条件是异或类型的方程,可以直接用bitset优化高斯消元. 至于求K,在高斯消元时记录用到的最大的方程的编号即可. 代码: // luogu-judger-enable-o2 #inclu ...
- LUOGU P4783 【模板】矩阵求逆(高斯消元)
传送门 解题思路 用高斯消元对矩阵求逆,设\(A*B=C\),\(C\)为单位矩阵,则\(B\)为\(A\)的逆矩阵.做法是把\(B\)先设成单位矩阵,然后对\(A\)做高斯消元的过程,对\(B\)进 ...
随机推荐
- 《C语言程序设计(第四版)》阅读心得(三)
第八章 指针 1.一个变量的地址称为该变量的指针 一个专门用来存放另一变量的地址(即指针),称它为指针变量.指针变量的值是指针(即地址) 如上图2000是变量的指针,pointer是指针变量, 赋值 ...
- Linux笔记:定时任务和文件操作
查看定时任务 crontab -l 注册定时任务 crontab -e然后就像 vim 一样编辑自己的定时任务.如: * * * * * . /home/hadoop/timer/check_job. ...
- Spring Data Jpa系列教程--------实体解析和关联关系
Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...
- [bzoj1324]Exca王者之剑_最小割
Exca王者之剑 bzoj-1324 题目大意:题目链接. 注释:略. 想法: 最小割经典模型. 所有格子向源点连权值为格子权值的边. 将棋盘黑白染色后白点反转源汇. 如果两个格子相邻那么黑点向白点连 ...
- Ubuntu 16.04开机自动挂载硬盘分区(转)
说明:如果挂载以前旧硬盘分区时不需要第2.3步! 1.查看Linux硬盘信息: sudo fdisk -l 2.格式化新硬盘(很危险,注意操作时确定硬盘分区的位置): sudo mkfs.ext4 / ...
- Linux 网络配置,ifconfig不显示ip地址的解决办法
进入到/etc/sysconfig/network-scripts 然后设置虚拟机的网络配置 这样就配置成功了
- 几点平时不太注意的CSS知识
1:文本显示的时候,我们发现左右参差不齐,text-align:justify 就能让文本左右都齐刷刷的啦: 2:input标签的内容,处于安全考虑,有时候我们并不希望别人黏贴复制,这时候这样干:& ...
- SVN 资源权限管理系统 SVNAdmin
原文:https://www.oschina.net/p/svn-admin
- 配置文件的备份和IOS 的备份
分享到 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 开心网 腾讯朋友 百度空间 豆瓣网 搜狐微博 百度新首页 QQ收藏 和讯微博 我的淘宝 百度贴吧 更多... 百度分享 广场 登录 注册 关注此 ...
- iOS 基于 MVC 的项目重构总结
关于MVC的争论 关于MVC的争论已经有非常多,对此我的观点是:对于iOS开发中的绝大部分场景来说,MVC本身是没有问题的,你觉得的MVC的问题,一定是你自己理解的问题(资深架构师请自己主动忽略本文) ...