1 条题解

  • 0
    @ 2025-8-24 21:41:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Point_Nine
    **

    搬运于2025-08-24 21:41:36,当前版本为作者最后更新于2021-07-12 07:12:34,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P2785

    前置知识

    计算几何基础公式:向量叉乘,两点距离公式。

    向量叉乘:模长等于两个向量围成平行四边形面积,实际上是计算三维向量(本题只使用本公式计算面积)。

    代码片段:

    double vec_ch(node a1,node a2)
    {
    	   return a1.x*a2.y-a2.x*a1.y;
    }
    

    两点距离公式:用勾股定理求解,x轴距离平方与y轴距离平方开根号。

    代码片段:

    double dis(node a,node b)
    {
    	return sqrt(pow(b.y-a.y,2)+pow(b.x-a.x,2));
    }
    

    基本思想:求得四边形面积,然后乘磁通量求解。

    分情况讨论:

    凸多边形。

    要求凸多边形面积,仅需以一个端点开始,将n边形分割为(n-2)个三角形,用向量叉乘求面积,累加面积。


    凹多边形

    类似凸多边形,现将编号以此排序然后,一条一条边枚举,如果逆时针转就面积加,逆时针就减去该面积,容斥之后为凹边形面积,不过无需另外计算旋转方向,因为叉乘时已经计算方向,直接累加即可。

    面积累加代码实现:

    double ans=0;
        for(int i=3;i<=n;i++)
        {
        	cin>>p[i].x>>p[i].y;
            line[i-1].x=p[i].x-p[1].x;
            line[i-1].y=p[i].y-p[1].y;
            ans+=vec_ch(line[i-1],line[i-2])/2;
    	}
    

    tips:叉乘求得面积是向量围成平行四边形面积,所以面积除以二才为三角形面积。

    完整代码:

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
           double x,y;
    }p[110000],s[110000],line[110000];
    void swap(node &a,node &b)
    {
    	 node mid;
    	 mid=a;
    	 a=b;
    	 b=mid;
    }
    double vec_ch(node a1,node a2)
    {
    	   //printf("%.3lf\n",a1.x*a2.y-a2.x*a1.y);
    	   return a1.x*a2.y-a2.x*a1.y;
    }
    double dis(node a,node b)
    {
    	return sqrt(pow(b.y-a.y,2)+pow(b.x-a.x,2));
    }
    int main()
    {
        int n;
        double m;
        cin>>n>>m;
        cin>>p[1].x>>p[1].y;
        cin>>p[2].x>>p[2].y;
        line[1].x=p[2].x-p[1].x;
        line[1].y=p[2].y-p[1].y;
        double ans=0;
        for(int i=3;i<=n;i++)
        {
        	cin>>p[i].x>>p[i].y;
            line[i-1].x=p[i].x-p[1].x;
            line[i-1].y=p[i].y-p[1].y;
            ans+=vec_ch(line[i-1],line[i-2])/2;
    	}
        printf("%.4lf",abs(ans)*m);
    }
    
    • 1

    信息

    ID
    1836
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者