【题目】
题目背景:
蒟蒻 HansBug 在物理考场上,挠了无数次的头,可脑子里还是一片空白。
题目描述:
眼下出现在 HansBug 蒟蒻面前的是一个奇怪的磁场,形状为多边形,可以描述为 n n n 个点构成的序列,这些点即依次为该磁场的各个顶点。于是现在蒟蒻 HansBug 想要知道该磁场的磁通量为多少。可是他脑细胞和 RP 已经消耗殆尽,所以这个高端的任务就交给你们啦。
输入格式:
第一行为一个整数 n n n( 1 ≤ n ≤ 1000000 1\le n\le1000000 1≤n≤1000000)和一个实数 b b b( 0 < b ≤ 10 0<b\le10 0<b≤10), b b b 为磁感应强度。
第 2 − n + 1 2 - n+1 2−n+1 行,每行包含两个实数,表示该点的横纵坐标。
输出格式:
一行,包含一个实数,即为磁通量(输出四舍五入保留四位小数)。
样例数据:
【样例 1 1 1】
输入
3 1
0 0
1 0
0 2
输出
1.0000
【样例 2 2 2】
输入
4 1
1 1
1 -1
-1 -1
-1 1
输出
4.0000
说明:
磁通量=磁感应强度*磁场区域面积
【分析】
求多边形面积的典型题目啦
题目中的点应该是按逆时针给出的,我开始还在琢磨怎么把点按逆时针排序呢
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
using namespace std;
struct point
{
double x,y;
point(){}
point(double x,double y):x(x),y(y){}
point operator+(const point &a){return point(x+a.x,y+a.y);}
point operator-(const point &a){return point(x-a.x,y-a.y);}
friend double dot(const point &a,const point &b){return a.x*b.x+a.y*b.y;}
friend double cross(const point &a,const point &b){return a.x*b.y-b.x*a.y;}
}p[N];
int main()
{
int n,i;
double B,S=0;
scanf("%d%lf",&n,&B);
for(i=1;i<=n;++i)
scanf("%lf%lf",&p[i].x,&p[i].y);
p[n+1]=p[1];
for(i=1;i<=n;++i)
S+=cross(p[i],p[i+1])*0.5;
printf("%.4lf",S*B);
return 0;
}