jzoj3736-[NOI2014模拟7.11]数学题(math)【计算几何】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3736-[NOI2014模拟7.11]数学题(math)【计算几何】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
給定兩個向量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|∣λ1?a+λ2?b∣的最小值,要求λ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°
然后我們分兩種情況討論:
這時推導
∣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);} }總結
以上是生活随笔為你收集整理的jzoj3736-[NOI2014模拟7.11]数学题(math)【计算几何】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Comet OJ(Contest #8)
- 下一篇: 璀璨的反义词 璀璨的意思