三点不共线
三点不共线
题目描述
平面上有两个不同的点 和 ,你需要找到另一个点 ,使得这三个点构成的 恰好为 。
需要注意的是,在下图中, 和 都可以被认为是 ,你只需让其中一个角为 即可。
输入描述:
每个测试文件均包含多个测试点。第一行输入一个整数 () 代表测试数据组数,每组测试数据描述如下:
第一行输入五个整数 , , , 和 (, , , ; ) 表示给定两点的坐标与需要构造的角度,保证两点不重合。
输出描述:
对于每组数据,你都需要在一行上输出两个实数 和 (, ) 表示 点的横、纵坐标,数字彼此间通过单个空格间隔。
当你的答案所构成的角 与 的误差不超过 时,均会被视为正确。换句话说,当你的答案满足 时,均会被视为正确。
示例1
输入
4
2 1 -1 -1 90
4 -1 1 3 100
1 1 1 2 60
9 2 5 4 36
输出
-1 1
4.178199262355 2.258649446766
1.866025403784 1.5
3.922316462825 -3.155367074351
说明
第一、二个测试点如下图所示。
备注:
如果有多个可能的答案,你只需要输出其中一种。
解题思路
给出一种与官方题解不同的做法。
做直线 的中点 ,并假设所求的 在 的中线 上,同时有 。由三角公式知道 ,其中 是直线 的长度,因此直线 长度就是 。
向量 ,则向量 ,因为 与 互相垂直,因此只需满足 即可。 的单位向量就是 。
所以最后 。
AC 代码如下,时间复杂度为 :
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
void solve() {
int x1, y1, x2, y2, a;
scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &a);
double d = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
double l = d / 2 / tan(a / 2.0 / 180 * acos(-1));
double dx = (y1 - y2) / d, dy = (x2 - x1) / d; // MC的单位向量为(dx, dy)
double x3 = (x1 + x2) / 2.0, y3 = (y1 + y2) / 2.0;
x3 += dx * l, y3 += dy * l;
printf("%.8f %.8f\n", x3, y3);
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
solve();
}
return 0;
}
参考资料
牛客小白月赛88 出题人题解:https://ac.nowcoder.com/discuss/1260072
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/18062056
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2023-03-08 构造有向无环图
2023-03-08 作物杂交
2022-03-08 组合数递推公式的推导