[浅谈] 高斯消元
所谓高斯消元就是解个
用矩阵记录每个方程的系数满足第
然后从消元,一个一个项消元,如消除
最后一一带回字符串。实现的细节还得看代码。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
int read(){
int x=0,f=1;char c=getchar();
while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n;
double mp[110][110],ans[110];
int main(){
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&mp[i][j]);
for(int i=1;i<=n;i++){
int rcd=i;
for(int j=i+1;j<=n;j++)
if(fabs(mp[rcd][i])<fabs(mp[j][i]))rcd=j;
if(fabs(mp[rcd][i])<eps){
printf("No Solution\n");
return 0;
}//找到系数最大的方程
if(i!=rcd)swap(mp[i],mp[rcd]);//换到当前行
double div=mp[i][i];//这个地方必须提出来,不然mp[i][i]会被修改
for(int j=i;j<=n+1;j++)
mp[i][j]/=div;//将此方程系数变为1
for(int j=i+1;j<=n;j++){
div=mp[j][i];//这个地方必须提出来,不然mp[j][i]会被修改
for(int k=i;k<=n+1;k++)
mp[j][k]-=mp[i][k]*div;//消元
}
}
ans[n]=mp[n][n+1];
for(int i=n-1;i>=1;i--){
ans[i]=mp[i][n+1];
for(int j=i+1;j<=n;j++)
ans[i]-=mp[i][j]*ans[j];
}
for(int i=1;i<=n;i++)printf("%.2lf\n",ans[i]);
return 0;
}
球心到所有点距离是一定的。我们把到第一个点的距离作为半径,球心到其他点的距离都等于这个半径:设球的圆心坐标用
化简:
高斯消元即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
int read(){
int x=0,f=1;char c=getchar();
while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n;
double mp[110][110],ans[110],tmp[50],now;
bool GSXY(){
for(int i=1;i<=n;i++){
int rcd=i;
for(int j=i+1;j<=n;j++)
if(fabs(mp[rcd][i])<fabs(mp[j][i]))rcd=j;
if(fabs(mp[rcd][i])<eps){
printf("No Solution\n");
return false;
}//找到系数最大的方程
if(i!=rcd)swap(mp[i],mp[rcd]);//换到当前行
double div=mp[i][i];
for(int j=i;j<=n+1;j++)
mp[i][j]/=div;//将此方程系数变为1
for(int j=i+1;j<=n;j++){
div=mp[j][i];
for(int k=i;k<=n+1;k++)
mp[j][k]-=mp[i][k]*div;//消元
}
}
ans[n]=mp[n][n+1];
for(int i=n-1;i>=1;i--){
ans[i]=mp[i][n+1];
for(int j=i+1;j<=n;j++)
ans[i]-=mp[i][j]*ans[j];
}
return true;
}
int main(){
n=read();
for(int i=1;i<=n;i++)scanf("%lf",&tmp[i]);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lf",&now);
mp[i][j]=2*now-2*tmp[j];
mp[i][n+1]+=now*now-tmp[j]*tmp[j];
}
}
GSXY();
for(int i=1;i<=n;i++)printf("%.3lf ",ans[i]);printf("\n");
return 0;
}
边太多了,我们考虑求每个点经过的期望次数。然后每个点都可以列出一个关于相邻点的
异或难实现,考虑按位考虑,考虑对每一位求为
线性基,但是高斯消元。就如线性基
另外这题卡精度,得用逆元,我用的模数:
这个条件显然可以用二分答案+高斯逆元,做完发现其实操作就是异或。但是会超时,因为只有
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探