uva920 扫描线水题

来源:互联网 发布:数据字典的功能 编辑:程序博客网 时间:2024/06/11 18:55
/**************************************************************题意:给你一些连续的山峰,山峰一边有平行于地面的阳光,求能被阳光照到的山坡的长度思路:先把出入的点按x排序一下,这样按顺序把点连接就是山峰了,然后从阳光来的方向扫描点,算出答案,求和***************************************************************/#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <cmath>using namespace std;struct Point{    int x,y;    Point(int a=0,int b=0):x(a),y(b){}}point[111];bool cmpx(Point a,Point b){return a.x<b.x || (a.x==b.x && a.y>b.y);}int main(){    int T,n,i,j;    double ans;    scanf("%d",&T);    while(T--)    {        ans=0.0;        scanf("%d",&n);        for(i=0;i<n;i++)        {            scanf("%d %d",&point[i].x,&point[i].y);        }        sort(point,point+n,cmpx);        int py=0;        for(i=n-1;i>=0;i--)        {            while(i>=0 && point[i].y<=py) i--;            if(i<0) break;            ans+=1.0*(point[i].y-py)/cos(atan2(1.0*(point[i+1].x-point[i].x),1.0*(point[i].y-point[i+1].y)));            py=point[i].y;            //printf("%d %d ans=%f\n",line[i],point[j].x,ans);        }        printf("%.2f\n",ans);    }    return 0;}

0 0
原创粉丝点击