HDU

来源:互联网 发布:ruby python nodejs 编辑:程序博客网 时间:2024/06/10 05:23

传送门
//题意: 给定圆上三点, 问第四个点是否在圆内.
//思路: 题意很简单, 方向也很好做. 直接求圆心, 求距离比较即可. 麻烦的是点的坐标范围都很大. 所以导致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++的话就可以看出来非常简单了.

原创粉丝点击