HDU
来源:互联网 发布:ruby python nodejs 编辑:程序博客网 时间:2024/06/16 22:26
传送门
//题意: 给定圆上三点, 问第四个点是否在圆内.
//思路: 题意很简单, 方向也很好做. 直接求圆心, 求距离比较即可. 麻烦的是点的坐标范围都很大. 所以导致ll都会爆, 精度也很难保证. 所以比赛时就想用到Java来实现高精度计算. 就是太久没碰Java了, 写起来很是生疏…. 这次相当于复习下Java了. 注意一点就是, 就是在嵌套使用大数之间的运算的时候, 如果实在不是很懂怎么运算的, 就多打几个括号就行了. 凡是进行了一次运算时就要用到它时, 就打一个括号!!!
Ac Code
import java.io.*; import java.math.*; import java.util.*;public class Main{ public static void main(String[] args){ Scanner cin = new Scanner(System.in); int t; t = cin.nextInt(); for(int i=1;i<=t;i++){ BigDecimal x1 = cin.nextBigDecimal(); BigDecimal y1 = cin.nextBigDecimal(); BigDecimal x2 = cin.nextBigDecimal(); BigDecimal y2 = cin.nextBigDecimal(); BigDecimal x3 = cin.nextBigDecimal(); BigDecimal y3 = cin.nextBigDecimal(); BigDecimal x4 = cin.nextBigDecimal(); BigDecimal y4 = cin.nextBigDecimal(); BigDecimal one = new BigDecimal(-1); BigDecimal two = new BigDecimal(2); BigDecimal xm = (x1.add(x2)).divide(two); BigDecimal ym = (y1.add(y2)).divide(two); BigDecimal px1 = xm.add(ym.subtract(y1)); BigDecimal py1 = ym.subtract(xm.subtract(x1)); BigDecimal px2 = xm.subtract(ym.subtract(y1)); BigDecimal py2 = ym.add(xm.subtract(x1)); xm = (x1.add(x3)).divide(two); ym = (y1.add(y3)).divide(two); BigDecimal px3 = (xm.add(ym)).subtract(y1); BigDecimal py3 = (ym.subtract(xm)).add(x1); BigDecimal px4 = (xm.subtract(ym)).add(y1); BigDecimal py4 = (ym.add(xm)).subtract(x1); BigDecimal k1 = (px4.subtract(px3)).multiply(py2.subtract(py1)); BigDecimal k2 = (px2.subtract(px1)).multiply(py4.subtract(py3)); BigDecimal a,b,c,d,e,f,ans_x,ans_y; a = k1.multiply(px1); b = k2.multiply(px3); c = py3.subtract(py1); d = px2.subtract(px1); e = px4.subtract(px3); f = k1.subtract(k2); ans_x = ((a.subtract(b)).add((c.multiply(d)).multiply(e))).divide(f); a = k2.multiply(py1); b = k1.multiply(py3); c = px3.subtract(px1); d = py2.subtract(py1); e = py4.subtract(py3); f = k2.subtract(k1); ans_y = ((a.subtract(b)).add((c.multiply(d)).multiply(e))).divide(f); BigDecimal r, dis; a = ans_x.subtract(x1); b = ans_y.subtract(y1); r = (a.multiply(a)).add(b.multiply(b)); a = ans_x.subtract(x4); b = ans_y.subtract(y4); dis = (a.multiply(a)).add(b.multiply(b)); //d.compart(r) d > r == 1; d < r == -1; d == r == 0; if(dis.compareTo(r) == 1){ System.out.println("Accepted"); } else{ System.out.println("Rejected"); } } }}
注: 我上面都细分了许许多多的小公式, 就是因为大数运算的括号里套过来套过去的, 为了逻辑的清楚, 所以全部细分出来, 并且尽量多大括号, 以分清哪里是哪里, 单独写. 公式也是很简单的. 用C++的话就可以看出来非常简单了.
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- Linux jdk的安装
- static关键字
- 第一章 导言 【C程序设计语言 第2版】
- 一点杂感
- 成功人士的3个好习惯
- HDU
- 同步条件变量(1)————等待多次事件
- Java虚拟机学习笔记三
- Comparer<T> 与 IComparer<T>
- 总结&计划
- [LCT && 主席树] BZOJ3514 .Codechef MARCH14 GERALD07 加强版
- 补码问题
- mysql聚集索引的优缺点
- hdu6215 Brute Force Sorting 模拟题+想法题