UVa 1643 - Angle and Squares(叉乘求面积)

给出两个点和多个正方形,求两点与原点连线和正方形围成的最大面积。
当正方形对角线共线且与两边构成等腰三角形是面积最大。联立方程求出三角形底边两点坐标,然后利用向量叉乘求出面积。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)&&n){
double ax,ay,bx,by;
scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);
double l=0,ans=0;
for(int i=0;i<n;++i){
double a;
scanf("%lf",&a);
l+=a;
ans-=a*a/2;
}
double k1=ay/ax,k2=by/bx;
if(k1>k2) swap(k1,k2);
ax=(k1+1)*l/(k2-k1),ay=k1*ax;
bx=(k2+1)*l/(k2-k1),by=k2*bx;
ans+=(ax*by-ay*bx)/2;
printf("%.3lf\n",ans);
}
return 0;
}

** 本文迁移自我的CSDN博客,格式可能有所偏差。 **