数学题
可以证明
所以我们每次把角度尽量增大
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
long long x_0,y_0,x_1,y_1;
double dis(long long x,long long y){
return sqrt(x*x+y*y);
}
double P(long long x_0,long long y_0,long long x_1,long long y_1){
double S=(x_0*x_1+y_0*y_1+0.0)/(sqrt(x_0*x_0+y_0*y_0)*sqrt(x_1*x_1+y_1*y_1)+0.0);
return S;
}
int main(){
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
while(scanf("%lld%lld%lld%lld",&x_0,&y_0,&x_1,&y_1)!=EOF){
while(P(x_0,y_0,x_1,y_1)>0.5||P(x_0,y_0,x_1,y_1)<0){
if(dis(x_0,y_0)>dis(x_1,y_1)) swap(x_0,x_1),swap(y_0,y_1);
double d0=dis(x_0,y_0),d1=dis(x_1,y_1),ita=P(x_0,y_0,x_1,y_1);
if(ita<0){
x_0=-x_0,y_0=-y_0;
continue;
}
if(P(x_0,y_0,x_1,y_1)>0.5){
long long lda=d1*ita/d0+0.5;
x_1=x_1-x_0*lda;
y_1=y_1-y_0*lda;
}
}
printf("%lld\n",min(x_0*x_0+y_0*y_0,x_1*x_1+y_1*y_1));
}
}