HDU 6206 Apple(高精度浮点数)
来源:互联网 发布:2017网络最火的歌曲 编辑:程序博客网 时间:2024/06/06 03:56
题目地址
题意:告诉你四个点,求最后一个点在不在前三个点围成的圆上。
思路:三个点连成的形状是一个三角形,那那个圆就是这个三角形的外接圆,那圆心应该就是在三角形的外心上,给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢?我在网上找到的公式:
给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y)
1. 首先,外接圆的圆心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程:
(x1-x)(x1-x)-(y1-y)(y1-y)=(x2-x)(x2-x)+(y2-y)(y2-y);
(x2-x)(x2-x)+(y2-y)(y2-y)=(x3-x)(x3-x)+(y3-y)(y3-y);
2.化简得到:
2*(x2-x1)x+2(y2-y1)y=x2^2+y2^2-x1^2-y1^2;
2*(x3-x2)x+2(y3-y2)y=x3^2+y3^2-x2^2-y2^2;
令A1=2*(x2-x1);
B1=2*(y2-y1);
C1=x2^2+y2^2-x1^2-y1^2;
A2=2*(x3-x2);
B2=2*(y3-y2);
C2=x3^2+y3^2-x2^2-y2^2;
即
A1*x+B1y=C1;
A2*x+B2y=C2;
3.最后根据克拉默法则:
x=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));
y=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));
因此,x,y为最终结果。
结合这个结论(转自:传送门),直接用JAVA的BigDecimal类就好了。
import java.io.*;import java.util.*;import java.math.BigDecimal;public class Main{ public static void main(String args[]) { Scanner cin = new Scanner(System.in); int n=cin.nextInt(); while(n!=0) { n--; BigDecimal[] x=new BigDecimal[4]; BigDecimal[] y=new BigDecimal[4]; for(int i=0;i<4;i++) { x[i]=cin.nextBigDecimal(); y[i]=cin.nextBigDecimal(); } BigDecimal two=new BigDecimal(2); BigDecimal a1,a2,b1,b2,c1,c2; a1=two.multiply(x[1].subtract(x[0])); b1=two.multiply(y[1].subtract(y[0])); c1=x[1].multiply(x[1]).add(y[1].multiply(y[1])).subtract(x[0].multiply(x[0]).add(y[0].multiply(y[0]))); a2=two.multiply(x[2].subtract(x[1])); b2=two.multiply(y[2].subtract(y[1])); c2=x[2].multiply(x[2]).add(y[2].multiply(y[2])).subtract(x[1].multiply(x[1]).add(y[1].multiply(y[1]))); //System.out.println(a1+" "+b1); //System.out.println(a1.multiply(b2).subtract(a2.multiply(b1))); BigDecimal nx=(c1.multiply(b2).subtract(c2.multiply(b1))).divide(a1.multiply(b2).subtract(a2.multiply(b1))); BigDecimal ny=(a1.multiply(c2).subtract(a2.multiply(c1))).divide(a1.multiply(b2).subtract(a2.multiply(b1))); BigDecimal R=(nx.subtract(x[0]).multiply(nx.subtract(x[0]))).add(ny.subtract(y[0]).multiply(ny.subtract(y[0]))); BigDecimal dd=(nx.subtract(x[3]).multiply(nx.subtract(x[3]))).add(ny.subtract(y[3]).multiply(ny.subtract(y[3]))); long zero=0; if(dd.compareTo(R)==1) { System.out.println("Accepted"); } else { System.out.println("Rejected"); } } }}
- HDU 6206 Apple(高精度浮点数)
- HDU 6206 Apple (数学 高精度计算)
- HDU 6206 Apple(高精度C++)
- HDU 1753 大明A+B(高精度浮点数运算)
- 格式化高精度浮点数
- 浮点数高精度
- 高精度浮点数运算
- Guess (浮点数,高精度)
- HDU 6026 Apple【高精度问题】
- uva748 ( 高精度 浮点数幂)
- 浮点数高精度相加(杭电1753A+B)
- poj1001解题报告(高精度浮点数乘法)
- (浮点数及整数)高精度乘除法
- java中浮点数的高精度运算
- PKU1001 定长浮点数高精度幂乘
- poj 1001 浮点数高精度求幂
- BigDecimal 处理高精度的浮点数
- 20140709 【高精度浮点数】POJ 1001 Exponentiation
- mysql 两表关联更新sql
- Ubuntu 16.04和windows10下chromedriver的编译
- 实现PXE自动安装系统
- linux的sed的学习笔记
- vi/vim常用配置和快捷键
- HDU 6206 Apple(高精度浮点数)
- <9/17>集训周记
- IPerf3 execution from Android 7
- node.js使用mongodb进行删除操作和修改操作
- 理解 JVM:Java 内存模型之(基础)
- 机器视觉专栏(二) 图像的颜色转换和阈值化
- 第一章 URL和资源
- New Year and Rating CodeForces
- 关于分布式事务、两阶段提交协议、三阶提交协议