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\)进 ...
随机推荐
- 582. Kill Process
Problem statement: Given n processes, each process has a unique PID (process id) and its PPID (paren ...
- Delphi XE4 inline 的用法
为了提高应用程序的性能,可以用inline声明一个函数过过程,对于声明为inline的过程,编译器在编译时,会取代正常的过程调用方式,取而代之是直接把这个函数的编译代码拿过来生成到调用该过程的地方,有 ...
- codevs——1013 求先序排列
1013 求先序排列 2001年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给出 ...
- oracle的processes和session最大限制
1.现象:oracle运行了一段时间后出现用户名连接不上,提示process已经达到最大值. 2.解决: --管理员身份登录 sqlplus / as sysdba --修改processes最大值, ...
- elk实时日志分析平台部署搭建详细实现过程
原文:http://blog.csdn.net/mchdba/article/details/52132663 1.ELK平台介绍 在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段:以下内容 ...
- 文件权限的获取,cmd命令:Takeown
takeown /f * /a /r /d y #强制将当前目录下的所有文件及文件夹.子文件夹下的所有者更改为管理员组(administrators)命令: cacls d:documents*.* ...
- ym——Android怎样支持多种屏幕
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 原文链接:http://developer.android.com/guide/pra ...
- 某法院HP-P4500存储数据恢复案例
好久没出来写博客了.过春节来了一直非常忙.尤其是近期,忙着做了好几个大单子.先是一个医院50TB的HP-EVA4400,接着是一个法院12TB的HP-P4500,前几天还有做了一个某游乐城12TB的V ...
- ubuntu上跑python连接pg,报错 ImportError: No module named psycopg2
ubuntu上跑python连接pg,报错 ImportError: No module named psycopg2 root@pgproxy1:~# python /home/zxw/PGWri ...
- Android仿微信朋友圈图片查看器
转载请注明出处:http://blog.csdn.net/allen315410/article/details/40264551 看博文之前,希望大家先打开自己的微信点到朋友圈中去,细致观察是不是发 ...