题目链接 codeforces 340B
题意
给出n个点,保证不会三点共线,不会两点重合,求组成的四边形的最大面积
题解:
将四边形看成两个三角形的面积和,可将题目的复杂度转化为 O(n^3)
1.三角形面积,用向量 ( (a1 * b2 ) - ( a2 * b1) ) / 2.0
double multi(node a, node b, node c){
return ((a.x - b.x) * (c.y - b.y) - (c.x - b.x) * (a.y - b.y)) / 2.0;
}
AC代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
double x, y;
}a[305];
double multi(node a, node b, node c){
return (a.x - b.x) * (c.y - b.y) - (c.x - b.x) * (a.y - b.y);
}
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].x >> a[i].y;
}
double ans = 0.0;
for(int i = 1; i <= n; i++){
for(int j = i + 1; j <= n; j++){
double s1 = 0.0, s2 = 0.0;
for(int k = 1; k <= n; k++){
double area = multi(a[i], a[j], a[k]) / 2.0; // 叉积计算三角形面积
if(area > 0){
s1 = max(s1, area);
}
else{
s2 = max(s2, -area);
}
}
if(s1 > 0 && s2 > 0){
ans = max(ans, s1+s2); // 两个三角形面积之和
}
}
}
printf("%.6lf\n", ans);
return 0;
}