正题
题目大意
给定两个向量a=(x1,y1),b=(x2,y2)a=(x_1,y_1),b=(x_2,y_2)a=(x1,y1),b=(x2,y2),然后求∣λ1a+λ2b∣|\lambda _1a+\lambda _2b|∣λ1a+λ2b∣的最小值,要求λ1,λ2\lambda_1,\lambda _2λ1,λ2不同时为0。
解题思路
我们先考虑若a,ba,ba,b的夹角大于90∘90^{\circ}90∘那么我们就让λ1\lambda_1λ1或λ2\lambda_2λ2取负数使得他们夹角在1∼90∘1\sim 90^{\circ}1∼90∘
然后我们分两种情况讨论:
- 向量a,ba,ba,b的夹角大于等于60∘60^{\circ}60∘
这时推导
∣ax+by∣=∣ax∣2+∣by∣2+2∗∣ax∣∣by∣cosα>=∣ax∣2+∣by∣2−2∗∣ax∣∣by∣cosα|ax+by|=|ax|^2+|by|^2+2∗|ax||by|\cos\alpha >=|ax|^2+|by|^2−2∗|ax||by|\cos\alpha∣ax+by∣=∣ax∣2+∣by∣2+2∗∣ax∣∣by∣cosα>=∣ax∣2+∣by∣2−2∗∣ax∣∣by∣cosα
因为向量x,yx,yx,y满足夹角大于等于60∘60^{\circ}60∘,所以2cosα<=12\cos \alpha<=12cosα<=1,不会影响答案我们将其去掉
∣ax+by∣>=∣ax∣2+∣by∣2−∣ax∣∣by∣>=(∣ax∣−∣by∣)2+∣ax∣∣by∣|ax+by|>=|ax|2+|by|^2−|ax||by|>=(|ax|−|by|)^2+|ax||by|∣ax+by∣>=∣ax∣2+∣by∣2−∣ax∣∣by∣>=(∣ax∣−∣by∣)2+∣ax∣∣by∣
∣ax+by∣2=(∣ax∣−∣by∣)2+∣ax∣∣by∣|ax+by|^2=(|ax|−|by|)^2+|ax||by|∣ax+by∣2=(∣ax∣−∣by∣)2+∣ax∣∣by∣
所以答案就是xxx和yyy中较大的那个 - 其他情况:
我们发现∣ax+by∣=∣a(x−ky)+(b+ak)y∣|ax+by|=|a(x-ky)+(b+ak)y|∣ax+by∣=∣a(x−ky)+(b+ak)y∣所以b⇒b+a∗kb\Rightarrow b+a*kb⇒b+a∗k可以进行转换
那么我们考虑这种转换的最优性
这一段证明较长,我就放论文了QvQQvQQvQ
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define sqr(x) ((x)*(x))
using namespace std;
ll x1,y1,x2,y2,a,b,t;
void dg(ll x1,ll y1,ll x2,ll y2)
{ll x=(x1*x2+y1*y2),l1=sqr(x1)+sqr(y1),l2=sqr(x2)+sqr(y2);bool bz;if(x<0){dg(-x1,-y1,x2,y2);a=-a;return;}if(sqr(x)*4<l1*l2||!x){if(l1>l2) b=1;else a=1;return;}if(l1<l2) swap(x1,x2),swap(y1,y2),bz=1;else bz=0;swap(l1,l2);ll t=x/l2,k=t+1;if(x-t*l2<=k*l2-x&&t){dg(x1-t*x2,y1-t*y2,x2,y2);b=b-t*a;}else{dg(x1-k*x2,y1-k*y2,x2,y2);b=b-k*a;}if(bz) swap(a,b);
}
int main()
{freopen("math.in","r",stdin);freopen("math.out","w",stdout);while(scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2)!=EOF){a=b=0;dg(x1,y1,x2,y2);t=sqr(a*x1+b*x2)+sqr(a*y1+b*y2);printf("%lld\n",t);}
}