题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=6206
题目大意
给你三个点(x1, y1), (x2, y2), (x3, y3), 可以确定一个圆, 再给你一个点(x, y), 问你该点和圆的关系,在圆外输出Accept, 在圆内或圆上输出Rejected
思路
比赛的时候题目乍一看思路很简单,就是根据三点算出圆的圆心和半径, 再比较点(x, y)到圆心距离和半径的大小就行了
可是比赛的时候这题将近200发提交没有一个人过
我队友用C++试了一下随便造了组数据就发现精度不够了
这时候就要Java的高精度类BigDecimal了
已知三点求圆的圆心坐标以及半径模板
a = 2 * (x2 - x1);
b = 2 * (y2 - y1);
c = x2 * x2 + y2 * y2 - x1 * x1 - y1 * y1;
d = 2 * (x3 - x2);
e = 2 * (y3 - y2);
f = x3 * x3 + y3 * y3 - x2 * x2 - y2 * y2;
x = (b * f - e * c) / (b * d - e * a);
y = (d * c - a * f) / (b * d - e * a);
r = sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
高精度类BigDecimal用法(浮点数)
(一)BigDecimal类的常用的几个构造方法
- BigDecimal(int):将int表示形式转换为BigDecimal对象
- BigDecimal(String) :将字符串表示形式转换为BigDecimal对象
- BigDecimal(double):将double表示形式转换为BigDecimal对象
(二)BigDecimal类的常用方法
- add(BigDecimal):BigDecimal对象中的值相加,返回BigDecimal对象
- subtract(BigDecimal):BigDecimal对象中的值相减,返回BigDecimal对象
- multiply(BigDecimal):BigDecimal对象中的值相乘,返回BigDecimal对象
- divide(BigDecimal):BigDecimal对象中的值相除,返回BigDecimal对象
- remainder(BigDecimal):BigDecimal对象中的值取余,返回BigDecimal对象
- toString():将BigDecimal对象中的值转换成字符串
- doubleValue():将BigDecimal对象中的值转换成双精度数
- floatValue():将BigDecimal对象中的值转换成单精度数
- longValue():将BigDecimal对象中的值转换成长整数
- intValue():将BigDecimal对象中的值转换成整数
(具体可参考此博客http://blog.csdn.net/qq_20785431/article/details/52281841)
代码
import java.io.*;
import java.math.*;
import java.util.*;
public class Main { //ACM竞赛中Java主类名一定要是Main
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for(int k=0; k<T; ++k)
{
BigDecimal x1 = in.nextBigDecimal();
BigDecimal y1 = in.nextBigDecimal();
BigDecimal x2 = in.nextBigDecimal();
BigDecimal y2 = in.nextBigDecimal();
BigDecimal x3 = in.nextBigDecimal();
BigDecimal y3 = in.nextBigDecimal();
BigDecimal x = in.nextBigDecimal();
BigDecimal y = in.nextBigDecimal();
BigDecimal a = x2.subtract(x1).multiply(BigDecimal.valueOf(2));
BigDecimal b = y2.subtract(y1).multiply(BigDecimal.valueOf(2));
BigDecimal c = (x2.multiply(x2).add(y2.multiply(y2))).subtract(x1.multiply(x1)).subtract(y1.multiply(y1));
BigDecimal d = x3.subtract(x2).multiply(BigDecimal.valueOf(2));
BigDecimal e = y3.subtract(y2).multiply(BigDecimal.valueOf(2));
BigDecimal f = (x3.multiply(x3).add(y3.multiply(y3))).subtract(x2.multiply(x2)).subtract(y2.multiply(y2));
BigDecimal g = b.multiply(d).subtract(e.multiply(a));
BigDecimal rx = b.multiply(f).subtract(e.multiply(c)).divide(g);
BigDecimal ry = d.multiply(c).subtract(a.multiply(f)).divide(g);
BigDecimal t1 = rx.subtract(x1);
BigDecimal t2 = ry.subtract(y1);
BigDecimal r = t1.multiply(t1).add(t2.multiply(t2));
t1 = rx.subtract(x);
t2 = ry.subtract(y);
BigDecimal rr = t1.multiply(t1).add(t2.multiply(t2));
if(rr.compareTo(r) == 1) System.out.println("Accepted");
else System.out.println("Rejected");
}
in.close();
}
}
心得
劳资学的Java终于派上用场了。。。
这次我比赛做了两题。。总算是有点贡献了