2017 ACM/ICPC Asia Regional Qingdao Online 1001/HDUOJ 6206 Apple

思路:已知三点求过三点的圆的圆心及半径即可,用java高精度实现。
设三点(x1, y1), (x2, y2), (x3, y3), 则以三点为圆心,r为半径的圆:
(x1 - x0)^2 + (y1 - y0)^2 = r^2
(x2 - x0)^2 + (y2 - y0)^2 = r^2
(x3 - x0)^2 + (y3 - y0)^2 = r^2
两两相减,化简得:
(x1 - x2)*x0 + (y1 - y2)*y0 = [(x1^2 - x2^2) - (y2^2 - y1^2)]/2
(x1 - x3)*x0 + (y1 - y3)*y0 = [(x1^2 - x3^2) - (y3^2 - y1^2)]/2
x0, y0有唯一解条件:系数行列式不为 0。
import java.util.*;
import java.io.*;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(new BufferedInputStream(System.in));
		int T = cin.nextInt();
		for(int t = 0; t < T; ++t) {
			BigDecimal[] ax = new BigDecimal[3], ay = new BigDecimal[3];
			BigDecimal bx, by;
			
			for(int i = 0; i < 3; ++i) {
				ax[i] = cin.nextBigDecimal();
				ay[i] = cin.nextBigDecimal();
			}
			bx = cin.nextBigDecimal();
			by = cin.nextBigDecimal();
			
			BigDecimal x1 = ax[0], x2 = ax[1], x3 = ax[2];
			BigDecimal y1 = ay[0], y2 = ay[1], y3 = ay[2];
			
			BigDecimal a = x1.subtract(x2), b = y1.subtract(y2);
			BigDecimal c = x1.subtract(x3), d = y1.subtract(y3);
			BigDecimal val = new BigDecimal(2.0);
			BigDecimal e = x1.multiply(x1).subtract(x2.multiply(x2)).add(y1.multiply(y1).subtract(y2.multiply(y2))).divide(val);
			BigDecimal f = x1.multiply(x1).subtract(x3.multiply(x3)).add(y1.multiply(y1).subtract(y3.multiply(y3))).divide(val);
			
			BigDecimal det = b.multiply(c).subtract(a.multiply(d));
			
			BigDecimal x0 = (d.multiply(e).subtract(b.multiply(f)).divide(det));
			BigDecimal y0 = (a.multiply(f).subtract(c.multiply(e)).divide(det));
			BigDecimal R = x1.add(x0).multiply(x1.add(x0)).add(y1.add(y0).multiply(y1.add(y0)));
			
			int ok = bx.add(x0).multiply(bx.add(x0)).add(by.add(y0).multiply(by.add(y0))).compareTo(R);
			if(ok > 0) System.out.println("Accepted");
			else System.out.println("Rejected");
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值