poj ACM1031

来源:互联网 发布:数据挖掘是什么 编辑:程序博客网 时间:2024/06/10 22:24

原题翻译如:
在一些平坦的场地上有一个被围栏围住的区域。篱笆具有高度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;}
原创粉丝点击