1 条题解
-
0
算法思路
- 退化情况处理:当多边形顶点数时,无法构成有效多边形,直接返回面积。
- Shoelace公式:对于顶点数的多边形,使用鞋带公式计算有向面积,再取绝对值的一半得到实际面积。
- 公式:$ S = \frac{1}{2} \left| \sum_{i=1}^{n} (x_i y_{i+1} - x_{i+1} y_i) \right| $
- 其中,,即首尾相连形成闭环。
- 四舍五入:将计算结果四舍五入为整数(题目保证不会出现恰好为的情况,无需特殊处理)。
关键点分析
-
输入处理:
- 每行可能包含多个顶点,需按行读取后分割解析。
- 输入以结束,需检查每行首个数字是否为。
-
浮点数精度:
- Shoelace公式涉及浮点数运算,但题目保证四舍五入后结果唯一,无需考虑精度误差。
-
顶点顺序:
- 顺时针或逆时针顺序均适用,因公式取绝对值,方向不影响结果。
代码实现
#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
- 上传者