分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

luogu4035 [JSOI2008]球形空间产生器

发布时间:2023-09-06 01:44责任编辑:顾先生关键词:暂无标签

如果单按照距离相等的话既是高次也没有半径,所以因为给了 \(n+1\) 组点就想到两两做差。
假如一组点是 \(\{a_i\}\) 一组是 \(\{b_i\}\),我们能轻易地得出
\[\sum_{i=1}^n(x_i-a_i)^2=\sum_{i=1}^n(x_i-b_i)^2 \Rightarrow \sum_{i=1}^n 2(b_i-a_i)x_i=\sum_{i=1}^n(b_i^2-a_i^2)\]
这是一个 \(n\) 元一次线性方程。我们能搞出 \(n\) 组这样的方程,高斯消元解之。

#include <iostream>#include <cstdio>#include <cmath>using namespace std;int n;double tmp1[15], tmp2[15], a[15][15];void gauss(){ ???for(int i=1; i<=n; i++){ ???????int maxi=i; ???????for(int j=i+1; j<=n; j++) ???????????if(fabs(a[j][i])>fabs(a[i][i])) ???????????????maxi = j; ???????double now=a[maxi][i]; ???????swap(a[maxi], a[i]); ???????for(int j=i; j<=n+1; j++) ???????????a[i][j] /= now; ???????for(int j=i+1; j<=n; j++){ ???????????now = a[j][i]; ???????????for(int k=i; k<=n+1; k++) ???????????????a[j][k] -= a[i][k] * now; ???????} ???} ???for(int i=n; i>=1; i--) ???????for(int j=1; j<=i-1; j++){ ???????????a[j][n+1] -= a[j][i] * a[i][n+1]; ???????????a[j][i] = 0; ???????}}int main(){ ???cin>>n; ???for(int i=1; i<=n; i++) scanf("%lf", &tmp1[i]); ???for(int i=1; i<=n; i++){ ???????for(int j=1; j<=n; j++) ???????????scanf("%lf", &tmp2[j]); ???????for(int j=1; j<=n; j++){ ???????????a[i][j] = 2 * (tmp2[j] - tmp1[j]); ???????????a[i][n+1] += tmp2[j] * tmp2[j] - tmp1[j] * tmp1[j]; ???????} ???????swap(tmp1, tmp2); ???} ???gauss(); ???for(int i=1; i<=n; i++) ???????printf("%.3f ", a[i][n+1]); ???printf("\n"); ???return 0;}

luogu4035 [JSOI2008]球形空间产生器

原文地址:https://www.cnblogs.com/poorpool/p/8519371.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved