一、题目解读

小红在二维平面上给定两个点 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​×∣xa​yb​−xb​ya​+x(ya​−yb​)∣

题目要求面积为 2,因此:1/2​×∣xa​yb​−xb​ya​+x(ya​−yb​)∣=2
两边乘以 2 简化为:∣C+K⋅x∣=4

其中常数项 C=xa​yb​−xb​ya​; 系数 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 位小数才对