紫书 习题 10-3 UVa 1643(计算几何 叉乘)
直观感觉对角线重合的时候面积最大
然后可以根据方程和割补算出阴影部分的面积
注意知道两点坐标,可以求出与原点形成的三角形的面积
用叉乘,叉乘的几何意义以这两个向量为边的平行四边形的面积
所以用叉乘除以2就可以
(x1, y1), (x2, y2),叉乘为x1y2-y1x2
#include<cstdio>
#include<cmath>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
int main()
{
int n;
while(~scanf("%d", &n) && n)
{
double xa, xb, ya, yb, k1, k2;
scanf("%lf%lf%lf%lf", &xa, &ya, &xb, &yb);
k1 = ya / xa, k2 = yb / xb;
if(k1 > k2) swap(k1, k2);
double L = 0, l, sum = 0;
REP(i, 0, n)
{
scanf("%lf", &l);
L += l;
sum += l * l / 2;
}
double x1 = (k1 + 1) / (k2 - k1) * L;
double x2 = (k2 + 1) / (k2 - k1) * L;
double y1 = k1 * x1, y2 = k2 * x2;
printf("%.3lf\n", (x1 * y2 - x2 * y1) / 2 - sum);
}
return 0;
}