NC223942. 简单的三角形构造
描述
给定一个半径为 ,圆心坐标为 的圆,以及圆内的一点 。
请你构造一个三角形,满足:
输入描述
六个整数,用空格隔开: , , , , ,
保证 点在圆的内部。
输出描述
如果可以完成构造,请输出任意合法解: 并用空格隔开,分别表示三角形的三个点 、 、
如果无论如何都不能完成构造,请输出-1。
本题需要满足以上三个条件,但允许答案存在 的误差。
示例1
输入:
3 0 0 1 1 1
输出:
-2.6 0.14 -2.8 0.05 0.9 0.6
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 452K, 提交时间: 2023-03-12 17:13:53
#include <iostream> #include <cmath> using namespace std; const double eps=1e-8; double getlen(double x,double y,double x0,double y0) { return sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0)); } int main() { double r,x,y,s,x0,y0; cin>>r>>x>>y>>s>>x0>>y0; double d=getlen(x,y,x0,y0); if(d>=r/2.0) d=r/2.0; double s1=(d+r)*sqrt(r*r-d*d); if(s-s1>eps) { printf("-1\n"); return 0; } if(abs(d-r/2.0)<=eps) { double x1=x0-x,y1=y0-y,t=d/sqrt(x1*x1+y1*y1); x0=x+x1*t; y0=y+y1*t; } if(x==x0&&y==y0) { printf("%lf %lf %lf %lf %lf %lf\n",x+r,y,x-r,y,x,y+r); } else { double x1=y-y0,y1=x0-x,t=sqrt(r*r-d*d)/sqrt(x1*x1+y1*y1),t1=r/sqrt(x1*x1+y1*y1); printf("%lf %lf %lf %lf %lf %lf\n",x0+x1*t,y0+y1*t,x0-x1*t,y0-y1*t,x-t1*y1,y+t1*x1); } return 0; }
C++ 解法, 执行用时: 4ms, 内存消耗: 404K, 提交时间: 2021-08-06 15:42:25
#include <stdio.h> #include <math.h> #include <algorithm> #include <iomanip> #include <iostream> typedef double ld; const ld eps = 1e-20; const ld pi = acosl(-1); using std::cin; using std::cout; using std::endl; using std::max; using std::setprecision; ld len(ld x,ld y){ return sqrtl(x*x+y*y); } int main(){ ld r,x,y,S,x0,y0; scanf("%lf%lf%lf%lf%lf%lf",&r,&x,&y,&S,&x0,&y0); x0 -= x; y0 -= y; ld alpha = atan2l(y0,x0); ld d = len(x0,y0); ld theta = acosl(d/r); theta = max(theta,pi/3); ld ans = sinl(theta)*(1+cosl(theta))*r*r; if(ans<S){ puts("-1"); }else{ printf("%.15f %.15f %.15f %.15f %.15f %.15f\n", x+r*cos(alpha-theta),y+r*sin(alpha-theta), x+r*cos(alpha+theta),y+r*sin(alpha+theta), x+r*cos(alpha+pi) ,y+r*sin(alpha+pi) ); } }
Python3 解法, 执行用时: 49ms, 内存消耗: 5316K, 提交时间: 2022-09-02 16:51:50
r,x,y,s,x0,y0 = list(map(int, input().split())) import math def getdis(x,y,x0,y0): return math.sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0)) eps=1e-8 d = getdis(x,y,x0,y0) if d>=r/2.0: d=r/2.0 s1=(d+r)*math.sqrt(r*r-d*d) if s-s1>eps: print('-1') else: if abs(d-r/2.0)<=eps: x1=x0-x y1=y0-y t=d/math.sqrt(x1*x1+y1*y1); x0=x+x1*t; y0=y+y1*t; if x==x0 and y==y0: print(x+r,y,x-r,y,x,y+r) else: x1=y-y0 y1=x0-x t=math.sqrt(r*r-d*d)/math.sqrt(x1*x1+y1*y1) t1=r/math.sqrt(x1*x1+y1*y1) print(x0+x1*t,y0+y1*t,x0-x1*t,y0-y1*t,x-t1*y1,y+t1*x1)