1 条题解

  • 0
    @ 2025-4-22 12:53:35

    要解决这个问题,我们需要计算围栏的总照明量,这可以分为几个步骤:

    输入解析:

    读取灯的强度常数k k 和围栏的高度 hh。 读取围栏的顶点坐标。

    计算照明量:

    对于围栏的每一条边,计算每个端点到灯的位置的距离 rr。 使用公式 I0=k/rI₀ = k / r 计算光强度。 计算该边上的法线方向,并利用边的端点计算该边的方向和法线向量。 计算照明量 dIdI,并积累到总照明量中。

    输出结果:

    将计算得到的总照明量格式化并输出到标准输出。

    代码实现

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    #include<queue>
    #define dist(a,b) sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))
    #define cross(a,b,c) (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)
    #define dot(a,b,c) (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y)
    #define delt(a) fabs(a)<eps?0:a>0?1:-1
    #define pi acos(-1.0)
    #define eps 1e-8
    #define inf 1e20
    #define N 1005
    using namespace std;
    int n,m,t,nl,ml;
    struct TPoint
    {
    	double x,y;
    }pt[N],st;
    void scan()
    {
    	scanf("%lf%lf%d",&st.x,&st.y,&n);
    	for(int i=0;i<n;i++) scanf("%lf%lf",&pt[i].x,&pt[i].y);
    }
    double getang(TPoint a,TPoint b)
    {
    	double ang1=atan2(a.y,a.x),ang2=atan2(b.y,b.x);
    	if(ang1-ang2>pi) ang2+=2*pi;
    	if(ang2-ang1>pi) ang1+=2*pi;
    	return ang1-ang2;
    }
    void solve()
    {
    	double minf=0,maxf=0,sumf=0;
    	pt[n]=pt[0];
    	for(int i=0;i<n;i++)
    	{
    		sumf+=getang(pt[i],pt[i+1]);
    		maxf=max(sumf,maxf);
    		minf=min(sumf,minf);
    		if(maxf-minf>2*pi)
    		{
    			maxf=minf+2*pi; break;
    		}
    	}
    	printf("%.2f\n",(maxf-minf)*st.x*st.y);
    }
    int main()
    {
    	scan();
    	solve();
    	return 0;
    }
    • 1

    信息

    ID
    32
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者