本题链接:https://ac.nowcoder.com/acm/contest/120563/H

题目大意:

小红在二维平面地图上标记了两个关键点 𝐴 ( 𝑥 𝑎 , 𝑦 𝑎 ) A(x a ​ ,y a ​ ) 和 𝐵 ( 𝑥 𝑏 , 𝑦 𝑏 ) B(x b ​ ,y b ​ )。 她现在需要在 x 轴上寻找一个锚点 𝑂 ( 𝑥 , 0 ) O(x,0),使得以 𝐴 , 𝐵 , 𝑂 A,B,O 为顶点的三角形面积恰好等于 2。 请你帮小红判断是否存在符合条件的锚点横坐标 x。如果存在,请找出一个符合条件的 x。

题目分析:在平面直角坐标系中,我们常用向量来求面积。这种方法在高中就学过了。 a点坐标(xa,ya),b点坐标(xb,yb),锚点坐标(x,0)。根据公式可以得到面积S=1/2*|(xb-xa)(0-ya)-(yb-ya)(x-xa)|=1/2fabs(-ya(xb-xa)+xa*(yb-ya)-x*(yb-ya)). alt

要点注意:要用double、要用fabs、要对特殊情况判断。

先看特殊情况ya=yb: 这时候s面积公式后面的ya-yb都直接消掉了,所以面积就是fabs(-ya*(xb-xa))/2 所以只要看面积是不是等于2即可,同时误差不超过0.0001

double res=fabs(-ya*(xb-xa));
		res/=2;
		if(fabs(res-2)<=0.0001){
			cout<<0.0;
		}
		else{
			cout<<"no answer";
		}
		return;

再看其他情况,直接让面积等于2,我们直接求横坐标x即可:此时横坐标x=(-ya*(xb-xa)+xa*(yb-ya)-4)/(yb-ya)

double x=(-ya*(xb-xa)+xa*(yb-ya)-4)/(yb-ya);
	printf("%.10f",x);

最后看一下整体代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
void solve(){
	double xa,ya;cin>>xa>>ya;
	double xb,yb;cin>>xb>>yb;
	if(ya==yb){
		double res=fabs(-ya*(xb-xa));
		res/=2;
		if(fabs(res-2)<=0.0001){
			cout<<0.0;
		}
		else{
			cout<<"no answer";
		}
		return;
	}
	double x=(-ya*(xb-xa)+xa*(yb-ya)-4)/(yb-ya);
	printf("%.10f",x);
	
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
}