当前位置: 首页 > news >正文

P4035 [JSOI2008]球形空间产生器

P4035 [JSOI2008]球形空间产生器

题目

题目大意

给出n维空间上的n+1个点,且这些店都在一个圆的表面,求圈心坐标.

定义:

  1. 球心:到球面上任意一点距离都相等的点。

  2. 两点间距离公式

\[ A(x_1,x_2,x_3,x_4,\cdots x_n) \]

\[ B(y_1,y_2,y_3,y_4,\cdots y_n) \]

\[ distance:\sqrt[2]{\sum_{i=1}^{n}(x_i-y_i)^2} \]


题目看上去应该就是解方程了。

我们可以使用gauss消元法

不过问题就来了。这是一个二次多元方程组。而我们的gauss只能解决一次。而且gauss的前提是有n个未知数,我们必须有n个方程。(当然有些不严谨

我们就要考虑移项和再设一个未知数

原方程中的一个:我们先设一个数,r。表示根据圆的标准方程算出来的半径
A为一个点,R为圆心

\[A(x_1,x_2,x_3,x_4,\cdots x_n)\]

\[R(y_1,y_2,y_3,y_4,\cdots y_n)\]

\[\sum_{i=1}^{n}(x_i-y_i)^2=r^2\]

\[\sum_{i=1}^{n}x_i^2-\sum_{i=1}^{n}2x_iy_i+\sum_{i=1}^{n}y_i^2=r^2\]

请注意这里的A的坐标都是已知量。而r和R的坐标不是

然后我们移项
\[-\sum_{i=1}^{n}2x_iy_i+(\sum_{i=1}^{n}y_i^2-r^2)=-\sum_{i=1}^{n}x_i^2\]

最绕的一步来了
我们将括号内的整体代换(或看成一个未知数)

这样就有n+1个未知数来了。而且我们解出方程来后,我们只需要前n个未知数。后面我们后面设的未知数虽然解出来了。但是没有什么用。只是我们一个辅助变量

同时,这个题也告诉我们一些小技巧。

  1. 出题人不可能多给条件。有些是要我们自己设的
  2. 遇到二次方程。可以考虑拆括号和移项。然后进行还原达到降幂的目的
#include<cstdio> 
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
double map[15][15];
double ans[15];
int n;
void gauss()
{
    for(int i=1;i<=n+1;i++)
    {
        int r=i;
        for(int j=i+1;j<=n+1;j++)
            if(fabs(map[r][i])<fabs(map[j][i]))
                r=j;
        if(r!=i)
            for(int j=i;j<=n+2;j++)
                swap(map[i][j],map[r][j]);
        double div=map[i][i]; 
        for(int j=i;j<=n+2;j++)
            map[i][j]/=div;
        for(int j=i+1;j<=n+1;j++)
        {
            div=map[j][i];
            for(int k=i;k<=n+2;k++)
                map[j][k]-=div*map[i][k];
        }
    }
    ans[n+1]=map[n+1][n+2];
    for(int i=n;i>=1;i--)
    {
        ans[i]=map[i][n+2];
        for(int j=i+1;j<=n+1;j++)
            ans[i]-=map[i][j]*ans[j];
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n+1;i++)
    {
        double data;
        for(int j=1;j<=n;j++) 
        {
            scanf("%lf",&data);
            map[i][j]=-2.0*data;
            map[i][n+2]-=data*data;
        }
        map[i][n+1]=1;
    }
    gauss();
    printf("%.3lf",ans[1]);
    for(int i=2;i<=n;i++)
        printf(" %.3lf",ans[i]);
}

转载于:https://www.cnblogs.com/Lance1ot/p/8970792.html

相关文章:

  • 简述this指向
  • 如何理解angular自定义指令directive的scope属性?
  • zabbix3配置阿里云邮箱告警
  • 小葵花妈妈课堂开课了:《Runnable、Callable、Future、RunnableFuture、FutureTask 源码分析》...
  • 跟我学Shiro电子书
  • 嵌入式视觉应用的疆土在逐步扩大
  • requests 中文乱码
  • [原]Python安装和使用MySQLdb库(Windows系统)
  • c# IPC实现本机进程之间的通信
  • 网络编程--基础TCP
  • 使用jMeter构造大量并发HTTP请求进行微服务性能测试
  • DAY18-Django之分页和中间件
  • jmeter接口测试步骤
  • 网关地址设置
  • [mvc] 简单的forms认证
  • Android框架之Volley
  • ES6语法详解(一)
  • MySQL QA
  • PAT A1120
  • React组件设计模式(一)
  • vue脚手架vue-cli
  • 规范化安全开发 KOA 手脚架
  • 全栈开发——Linux
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 学习JavaScript数据结构与算法 — 树
  • 转载:[译] 内容加速黑科技趣谈
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #QT(串口助手-界面)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (06)Hive——正则表达式
  • (23)Linux的软硬连接
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (windows2012共享文件夹和防火墙设置
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (四)Controller接口控制器详解(三)
  • (算法)求1到1亿间的质数或素数
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .Net IE10 _doPostBack 未定义
  • .net下的富文本编辑器FCKeditor的配置方法
  • //解决validator验证插件多个name相同只验证第一的问题
  • [Android学习笔记]ScrollView的使用
  • [C# 基础知识系列]专题十六:Linq介绍
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • [hdu 1247]Hat’s Words [Trie 图]
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • [JS设计模式]Prototype Pattern
  • [LeetCode]-Spiral Matrix III 螺旋矩阵
  • [office] excel中weekday函数的使用方法 #学习方法#微信#媒体
  • [QT]抄—影像显示实验
  • [rancher] rancher部署和使用的一些思考
  • [RN] React Native 常用命令行