洛谷 P2785 物理1(phsic1)- 磁通量

洛谷 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⃗ b⃗ =12|a⃗ ||b⃗ |sinθ θ 为两向量共起点时之间的夹角))

而这个贡献值的正负就是根据边的两点的位置关系(顺、逆时针)来确定的(当然所有贡献值有可能是负的,所以需要绝对值)

然后,我们就可以很自然的用向量积来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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值