洛谷 P2785 物理1(phsic1)- 磁通量
题目
题目背景
蒟蒻HansBug在物理考场上,挠了无数次的头,可脑子里还是一片空白。
题目描述
眼下出现在HansBug蒟蒻面前的是一个奇怪的磁场,形状为多边形,可以描述为N个点构成的序列,这些点即依次为该磁场的各个顶点。于是现在蒟蒻HansBug想要知道该磁场的磁通量为多少。可是他脑细胞和RP已经消耗殆尽,所以这个高端的任务就交给你们啦。
输入输出格式
输入格式:
第一行为一个整数N(1<=N<=1000000)和一个实数B(0
3 1
0 0
1 0
0 2
输出样例#1:
1.0000
输入样例#2:
4 1
1 1
1 -1
-1 -1
-1 1
输出样例#2:
4.0000
说明
磁通量=磁感应强度*磁场区域面积
题解
emm,一道数学的题目
首先,我们可以想到,对于任意凸多边形形,一定可以被分成 n 个三角形
然而,对于凹多边形,这个就不一定能成立了
所以,我们就需要另外一个想法了
对于凹多边形的任意一条边与该平面上任意一点形成的三角形的面积对于凹多边形的贡献不是正的,就是负的
(即计算
而这个贡献值的正负就是根据边的两点的位置关系(顺、逆时针)来确定的(当然所有贡献值有可能是负的,所以需要绝对值)
然后,我们就可以很自然的用向量积来A掉次题(边的顺序必须是头尾相接的,否则会WA)
代码
#include<cstdio>
using namespace std;
int n;
double B,S;
double x[1000005],y[1000005];
double abs(double x){return x<0?-x:x;}
int main()
{
scanf("%d%lf",&n,&B);
for (int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
x[n+1]=x[1];y[n+1]=y[1];
for (int i=1;i<=n;i++) S+=x[i]*y[i+1]-x[i+1]*y[i];
printf("%.4lf",(abs(S)*B)/2);
return 0;
}