一、题目解读
小红在二维平面上给定两个点 A(xa,ya) 和 B(xb,yb),需要在 x 轴上找到一个点 O(x,0),使得以 A、B、O 为顶点的三角形面积恰好等于 2。若存在这样的 x,输出任意一个满足条件的实数(绝对误差不超过 0.001 即可);若不存在,输出 no answer。
二、输入输出描述
输入
第一行:两个整数 xa,ya(范围 [−104,104]),表示点 A 的坐标; 第二行:两个整数 xb,yb(范围 [−104,104]),表示点 B 的坐标。
输出
若存在满足条件的 x,输出一个符合要求的实数; 若不存在,输出 no answer。
三、解题思路
三角形面积公式推导
给定 A(x a ,y a )、 B(x b ,y b ),要在 x 轴上找点 ) O(x,0) 使得三角形 ABO 面积为2。
三角形面积的行列式公式为:Area=1/2×∣xa(yb−0)+xb(0−ya)+x(ya−yb)∣
整理后为:Area=1/2×∣xayb−xbya+x(ya−yb)∣
题目要求面积为 2,因此:1/2×∣xayb−xbya+x(ya−yb)∣=2
两边乘以 2 简化为:∣C+K⋅x∣=4
其中常数项 C=xayb−xbya; 系数 K=ya−yb。
四、完整代码
#include <functional>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;
#define endl '\n'
int main() {
IOS;
// 读取输入的两个点坐标
double xa, ya, xb, yb;
cin >> xa >> ya >> xb >> yb;
// 计算常数项C和系数K
double C = xa * yb - xb * ya;
double K = ya - yb;
// 分情况判断并求解
if (fabs(K) < 1e-9) { // K=0(浮点数精度处理)
if (fabs(C) - 4.0 < 1e-9 && 4.0 - fabs(C) < 1e-9)
cout << fixed << setprecision(10) << 0.0 << endl;
else
cout << "no answer" << endl;
} else { // K≠0时
double x = (4.0 - C) / K; // 选第一个解,也可以选(-4-C)/K
cout << fixed << setprecision(10) << x << endl;
}
return 0;
}
坑点(精度):只保留 3 位小数会直接 WA。直接输出 10 位小数才对。

京公网安备 11010502036488号