标签:pac mat pts += cin algorithm 排序 曲线 name
二维平面坐标系上有一些散乱点,首先需要根据点的y坐标值将散乱点排序,之后将点连接成一条开放的多边形曲线。 给定一条和Y轴平行的旋转轴x=x?0??,此时将多边形曲线按旋转轴x = x?0??做镜像,并在最底端和最高端的原始点和镜像点之间连接两条线段,从而构成一个封闭的对称图形,请你计算该图形的面积。对称轴的x?0??坐标值要么大于所有散乱点的x坐标值,要么小于所有点的x坐标,因此该对称图形不存在自交现象。题目保证所有散乱点的y坐标值都不相同。
第一行给出平行于y轴的旋转轴的x坐标x?0??,第二行给出正整数n (2≤ n ≤10?4??),表示散乱点个数,随后n行给出散乱点的x和y坐标。
输出该对称图形的面积,保留2位小数。
例如输入1:
3.0 2 -1.5 1.5 1.5 -1.5
输出:
18.00
例如输入2:
-10.25 5 -1.5 1.5 -1.5 4.5 1.5 -1.5 10.5 -11.5 21.52 20.5
输出:
1087.32
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; #define N 10000 struct vi { double x; double y; }; bool cmp(vi a, vi b) { return a.y > b.y; } int main() { double x0, x, y, s = 0, flag=-1; int n; cin >> x0 >> n; vi v[N]; for (int i = 0; i < n; i++) { cin >> x >> y; v[i].x = x; v[i].y = y; if (x > x0) flag = 1; } sort(v, v + n, cmp); for (int i = 0; i < n-1; i++) { if (flag==-1) s+= ((x0 - v[i].x) + (x0 - v[i+1].x))*(v[i].y - v[i+1].y) / 2; else s += ((v[i].x -x0) + (v[i+1].x -x0))*(v[i].y - v[i+1].y) / 2; } s = 2 * s; printf("%.02f", s); }
标签:pac mat pts += cin algorithm 排序 曲线 name
原文地址:https://www.cnblogs.com/luoyoooo/p/12215801.html