问题描述
在平面直角坐标系上有一个点P, 他的坐标是(x,y). 有一条直线y=kx+b经过了P, 且分别交x,y正半轴于A,B. 求∣PA∣∗∣PB∣的最小值.
输入描述
第一行一个T, 表示数据组数. 接下来T行每行两个正整数x,y, 表示P的坐标. T=500,0<X,Y≤10000
输出描述
T行,每行一个数字,表示每组数据的答案
输入样例
1 2 1
输出样例
4
Hint
样例中P(2,1), 取直线y=−x+3, 他经过了P并分别交x,y正半轴于A(3,0),B(0,3).∣PA∣=√2,∣PB∣=2√2,∣PA∣∣PB∣=4,经验证确实是最小值.
没有BC官方的简单,可能是很久都没有做到这类型的题型了吧。其实还是知识不够牢靠吧。
我直接暴力找到的关系。花费很多时间,后面才来总结吧。
设P(x,y),A(0,b),B((-bx)/(y-b),0)
强行解出PA的距离和PB的距离
PA的距离=√(x^2+y^2+b^2-2*b);
PB的距离=√ (((x^2+y^2+b^2-2*b)*y^2)/(y-b)^2);
直接PA*PB=y*(x^2+y^2+b^2-2*b*y)/(y-b);
=y*(x^2+(y-b)^2)/(y-b);
=y*x^2/(y-b)+(y-b);
然后均值放缩。
min(PA*PB)=2*x*y,
当且仅当x^2/(y-b)=(y-b);
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int x,y;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&x,&y);
printf("%d\n",x*y*2);
}
}
官方做法就用角度来表示PA和PB,然后三角函数求解。简单。