poj ACM1031

原题翻译如:
在一些平坦的场地上有一个被围栏围住的区域。篱笆具有高度h,在平面投影中,它具有由其N个顶点的笛卡尔坐标(Xi,Yi)指定的封闭多边形线(无自相交)的形式。在坐标(0,0)的点上,一个灯站在场上。灯可以位于栅栏的外部或内部,但不在其侧面,如下图所示(图中细线所示的部分不被灯照亮):

栅栏是完全黑色的,即它既不反射也不扩散,也不能让光通过。研究和实验表明,以下法律表达了落在该栅栏任意照明点的光强度:
I 0 = k / r

其中k是不取决于所讨论点的已知常数值,r是平面投影中该点与灯之间的距离。具有宽度d1和高度h的无穷小窄垂直板的照明
dI = I 0 * |cosα| * dl * h

其中I 0是栅栏板上的光的强度,α是在该点处的栅栏侧面的法线与灯的方向之间的平面投影中的角度。
您将编写一个程序,将找到围墙的总照度,该照明被定义为所有照明板的照明总和。
输入

输入文件的第一行包含数字k,h和N,以空格分隔。k和h是实常数。N(3 <= N <= 100)是围栏的顶点数。然后N行跟随,每行包含两个实数Xi和Yi,由空格分隔。
产量

将输入文件写入栅格的总照明四舍五入到小数点后的第二位。
样品输入

0.5 1.7 3
1.0 3.0
2.0 -1.0
-4.0 -1.0
样品输出

5.34
代码如下:

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值