列表

详情


NC223942. 简单的三角形构造

描述

给定一个半径为 ,圆心坐标为 的圆,以及圆内的一点 
请你构造一个三角形,满足:

  1. 三角形的三点都在圆的内部
  2. 不在三角形内部(点 在三角形边上可以视为合法)
  3. 三角形的面积不小于

输入描述

六个整数,用空格隔开: , , , , , y_0

保证 点在圆的内部。



输出描述

如果可以完成构造,请输出任意合法解:  并用空格隔开,分别表示三角形的三个点 
如果无论如何都不能完成构造,请输出-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)

上一题