2017 ACM/ICPC Asia Regional Qingdao Online:1001 Apple


题目给出4个点,让后让判断第四个点是否在前三个点所组成的三角形的外接圆的外面,

如果在外界圆外输出:Accepted

否则输出:Rejected


就按照公式写,但是用C和C++怎么写都些不过,应该是浮点运算的精度缺失。

最后看到大家都用JAVA在写,还好最近在学JAVA,JAVA中有个BigDecimal类,用于高精度大实数运算,

就把原来的C++代码翻译成JAVA代码,提交就过了。


不过的C++代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#define eps 1e-7
using namespace std;
int main()
{
    int T;
    double x,y,x1,x2,x3,y1,y2,y3;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x,&y);
        
        /*
        double a=sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) );
        double b=sqrt( (x1-x3)*(x1-x3)+(y1-y3)*(y1-y3) );
        double c=sqrt( (x2-x3)*(x2-x3)+(y2-y3)*(y2-y3) );
        double p=(a+b+c)/2;
        double S=sqrt( p*(p-a)*(p-b)*(p-c) );
        double radius=a*b*c/(4.0*S);
        */
        //求外接圆圆心
        double t1=x1*x1+y1*y1;
        double t2=x2*x2+y2*y2;
        double t3=x3*x3+y3*y3;
        double temp=x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2;
        double X=(t2*y3+t1*y2+t3*y1-t2*y1-t3*y2-t1*y3)/(temp*2);
        double Y=(t3*x2+t2*x1+t1*x3-t1*x2-t2*x3-t3*x1)/(temp*2);
        double radius = sqrt((x1-X)*(x1-X)+(y1-Y)*(y1-Y));
        if(((x-X)*(x-X)+(y-Y)*(y-Y))>(radius*radius))
        {
            printf("Accepted\n");
        }
        else
        {
            printf("Rejected\n");
        }
    }
    return 0;
}




就是变量的运算太多了,JAVA中全是对象,得调用方法,方法嵌套好多层,写得时候我看的都眼花了。

AC的java代码:

import java.math.*;
import java.util.Scanner;

public class Main {

	static BigDecimal Add(BigDecimal a,BigDecimal b) {
		return a.add(b);
	}
	static BigDecimal Mul(BigDecimal a,BigDecimal b) {
		return a.multiply(b);
	}
	static BigDecimal Sub(BigDecimal a,BigDecimal b) {
		return a.subtract(b);
	}
	static BigDecimal Div(BigDecimal a,BigDecimal b) {
		return a.divide(b);
	}
	public static void main(String args[]) {
		BigDecimal[] b = new BigDecimal[10];
		BigDecimal[] t = new BigDecimal[15];
		Scanner input = new Scanner(System.in);
		int T = input.nextInt();
		while(T != 0){
			//b[1]~b[8]对应(x1,y1)(x2,y2) (x3,y3) (x,y)
			for(int i = 1; i <= 8; i++){
				b[i] = input.nextBigDecimal();
			}
			//t1
			t[1] = Add(Mul(b[1],b[1]),Mul(b[2],b[2]));
			//t2
			t[2] = Add(Mul(b[3],b[3]),Mul(b[4],b[4]));
			//t3
			t[3] = Add(Mul(b[5],b[5]),Mul(b[6],b[6]));
			//temp   x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2;
			t[4] = Sub(Add(Add(Mul(b[1],b[4]),Mul(b[3],b[6])),Mul(b[5],b[2])),Add(Add(Mul(b[1],b[6]),Mul(b[3],b[2])),Mul(b[4],b[5])));
			//X   X=(t2*y3+t1*y2+t3*y1-t2*y1-t3*y2-t1*y3)/(temp*2);
			t[5] = Sub(Add(Add(Mul(t[2],b[6]),Mul(t[1],b[4])),Mul(t[3],b[2])),Add(Add(Mul(t[2],b[2]),Mul(t[3],b[4])),Mul(t[1],b[6])));
			//Y   (t3*x2+t2*x1+t1*x3-t1*x2-t2*x3-t3*x1)/(temp*2);
			t[6] = Sub(Add(Add(Mul(t[3],b[3]),Mul(t[2],b[1])),Mul(t[1],b[5])),Add(Add(Mul(t[1],b[3]),Mul(t[2],b[5])),Mul(t[3],b[1])));
			//temp*2
			t[7] = Mul(t[4],BigDecimal.valueOf(2.0));
			//X
			t[8] = Div(t[5],t[7]);
			//Y
			t[9] = Div(t[6],t[7]);
			//Radis*Radis
			t[10] = Add(Mul(Sub(b[1],t[8]),Sub(b[1],t[8])),Mul(Sub(b[2],t[9]),Sub(b[2],t[9])));
			t[11] = Add(Mul(Sub(b[7],t[8]),Sub(b[7],t[8])),Mul(Sub(b[8],t[9]),Sub(b[8],t[9])));
			if(t[11].compareTo(t[10]) > 0){
				System.out.println("Accepted");
			}
			else{
				System.out.println("Rejected");
			}
			T--;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值