/************************************************************** 题意:给你一些连续的山峰,山峰一边有平行于地面的阳光,求能被阳光照到的山坡的长度 思路:先把出入的点按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; }