列表

详情


NC15385. 小马过河

描述

 开始涉猎几何领域了。他现在正在研究小马喝水问题。
众所周知,这个问题中有一匹口渴的小马,一条笔直的河,以及小马的家。小马需要去河边喝水,然后再去家里。它需要走最短的路径。

解决这个问题也很简单,其中有一个步骤是要做小马家关于河水的对称点。
正对此感到一些烦恼。他不会做这个。他想请你帮他作一条过小马家且垂直于河水的线,然后告诉 垂足的位置。

输入描述

第一行一个整数  ,表示  的询问个数。
接下去 行,每行 个实数 ,表示小马家在点  ,河水为直线 

输出描述

输出共  行,每行两个实数 , 表示答案垂足点的坐标 。 
当你的答案与标准输出的误差小于  时,视为答案正确。

示例1

输入:

3
0 1 0 0 1 1
2.13 -6.89 1.78 1.20 -7.73 0.56
3.473 -4.326 -4.851 -0.819 2.467 -2.729

输出:

0.5000000 0.5000000
1.5864392 1.1869738
3.7990750 -3.076672

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 384K, 提交时间: 2020-07-23 01:31:59

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		double x1,x2,x3,y1,y2,y3;
		cin>>x1>>y1>>x2>>y2>>x3>>y3;
		double k=((x1-x2)*(x3-x2)+(y1-y2)*(y3-y2))/((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
		printf("%.7lf %.7lf\n",x2+k*(x3-x2),y2+k*(y3-y2));
	}
} 

C 解法, 执行用时: 4ms, 内存消耗: 348K, 提交时间: 2023-01-10 15:00:17

#include<stdio.h>
int main(){
	int T;
	double px,py,ux,uy,vx,vy,x,y,k;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf%lf%lf%lf%lf",&px,&py,&ux,&uy,&vx,&vy);
		k=(uy-vy)/(ux-vx);
		x=(px+k*py+k*k*vx-k*vy)/(k*k+1);
        y=k*(x-vx)+vy;
		printf("%lf %lf\n",x,y);
	}
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 8ms, 内存消耗: 492K, 提交时间: 2023-03-28 12:04:08

#include<bits/stdc++.h>
using namespace std;
int T;
double px,py,ux,uy,vx,vy;
int main(){
	cin>>T;
	while(T--){
		cin>>px>>py>>ux>>uy>>vx>>vy;
		double k=(uy-vy)/(ux-vx);
		double x=(k*py-k*uy+k*k*ux+px)/(k*k+1);
		double y=k*(x-ux)+uy;
		printf("%.7lf %.7lf\n",x,y);
	}
} 

Python3 解法, 执行用时: 85ms, 内存消耗: 4636K, 提交时间: 2022-11-14 17:40:08

T=int(input())
for i in range(T):
    a,b,c,d,e,f=map(eval,input().split())
    k1=(f-d)/(e-c)
    m=f-(k1*e)
    x=((b*k1)-(k1*m)+a)/(1+pow(k1,2))
    y=(k1*x)+m
    print('%.7f'%x,end=' ')
    print('%.7f'%y)

上一题