1 条题解

  • 0
    @ 2025-5-19 19:08:34

    算法思路

    1. 退化情况处理:当多边形顶点数k<3k < 3时,无法构成有效多边形,直接返回面积00
    2. Shoelace公式:对于顶点数k3k \geq 3的多边形,使用鞋带公式计算有向面积,再取绝对值的一半得到实际面积。
      • 公式:$ S = \frac{1}{2} \left| \sum_{i=1}^{n} (x_i y_{i+1} - x_{i+1} y_i) \right| $
      • 其中,(xn+1,yn+1)=(x1,y1)(x_{n+1}, y_{n+1}) = (x_1, y_1),即首尾相连形成闭环。
    3. 四舍五入:将计算结果四舍五入为整数(题目保证不会出现恰好为0.50.5的情况,无需特殊处理)。

    关键点分析

    1. 输入处理

      • 每行可能包含多个顶点,需按行读取后分割解析。
      • 输入以00结束,需检查每行首个数字是否为00
    2. 浮点数精度

      • Shoelace公式涉及浮点数运算,但题目保证四舍五入后结果唯一,无需考虑精度误差。
    3. 顶点顺序

      • 顺时针或逆时针顺序均适用,因公式取绝对值,方向不影响结果。

    代码实现

    #include<cstdio>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int K=1e4+5;
    typedef double dl;
    struct point{//既是向量又是点
    	dl x;
    	dl y;
    }q[K];
    int n;
    inline point getmag(point a,point b){
    	point s;
    	s.x=b.x-a.x;s.y=b.y-a.y;
    	return s;
    }
    inline dl multiX(point a,point b){
    	return a.x*b.y-b.x*a.y;
    }
    inline dl area(){
    	dl ans=0;
    	for(int i=1;i<=n;i++){
    		ans+=multiX(getmag(q[0],q[i]),getmag(q[0],q[i%n+1]));
    	}
    	return fabs(ans)/2;
    }
    int main(){
    	q[0].x=0,q[0].y=0;
    	while(scanf("%d",&n)!=EOF&&n){
    		for(int i=1;i<=n;i++){
    			scanf("%lf%lf",&q[i].x,&q[i].y);
    		}
    		printf("%d\n",(int)round(area()));
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    2900
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者