cf 340b差积

题意给你n个点,每个点有x,y坐标,让你求出来能组成的四边形最大面积是多少
思路这个是一个叉积,叉积是啥呢?,就是给你四个点,我复制了一把别人的

向量的叉积性质都忘完了……但是它可以用来判断点在直线的某侧。进而可以解决点是否在三角形内,两个矩形是否重叠等问题。向量的叉积的模表示这两个向量围成的平行四边形的面积。 
设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P×Q = x1*y2 - x2*y1,其结果是一个伪矢量。 
显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。 

叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
若 P × Q > 0 , 则P在Q的顺时针方向。
若 P × Q < 0 , 则P在Q的逆时针方向。
若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
叉积的方向与进行叉积的两个向量都垂直,所以叉积向量即为这两个向量构成平面的法向量。
如果向量叉积为零向量,那么这两个向量是平行关系。
因为向量叉积是这两个向量平面的法向量,如果两个向量平行无法形成一个平面,其对应也没有平面法向量。所以,两个向量平行时,其向量叉积为零。

然后这个题吧,就是n是三百,应该是n三方,不能使n四次方,每次都选取三角形,然后连个三角形一拼就是四边形

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

struct point{
    double x , y;
}p[310];

double cross_funtion(point a , point b , point c)
{
    return ((a.x - c.x)*(b.y - c.y) - (b.x - c.x)*(a.y - c.y))/2;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1 ; i <= n ; i++){
        scanf("%lf %lf",&p[i].x , &p[i].y);
    }
    double sum = 0 , lmax = 0 , rmax = 0;
    for(int i = 1 ; i <= n ; i++){
        for(int j = i + 1 ; j <= n ; j++){
            lmax = 0 , rmax = 0;
            for(int k = 1 ; k <= n ; k++){
                if(k == i || k == j) continue;
                double tmp = cross_funtion(p[i] , p[j] , p[k]);
                if(tmp <= 0){
                    lmax = max(lmax , -tmp);
                }
                else{
                    rmax = max(rmax , tmp);
                }
                if(lmax == 0 || rmax == 0) continue;
                sum = max(sum , lmax + rmax);
            }
        }
    }
    printf("%lf\n",sum);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值