题目链接:https://vjudge.net/problem/POJ-3347
题意:坐标上从左往右放置几个正方形,且旋转45°,下顶点落在x轴上,求从上往下可以看见哪些正方形
思路:好恶心。。。。算出每个正方形左右顶点的坐标,当第一个正方形确定后,以后的每下一个的正方形从左往右紧贴着之前的正方形,最大的就是该正方形准确位置,运算过程中合理使用乘除根号2,当正方形被覆盖时,该正方形的左端点的x坐标为她前一个正方形右端点的x坐标,这样一来左右端点x值相减时就好判断是否被覆盖,仔细画图就能理解。。。。
1 // 2 // Created by HJYL on 2020/1/17. 3 // 4 #include<iostream> 5 #include<cstring> 6 #include<cstdio> 7 #include<cmath> 8 #include<algorithm> 9 using namespace std; 10 const double eps=1e-8; 11 const int maxn=100; 12 const double gen2=sqrt(2.0); 13 struct Point{ 14 double left,right,len; 15 }; 16 int main() 17 { 18 19 int T; 20 while(~scanf("%d",&T)&&T) 21 { 22 Point p[maxn]; 23 for(int i=0;i<T;i++) 24 scanf("%lf",&p[i].len); 25 p[0].left=0.0; 26 for(int i=0;i<T;i++) 27 { 28 double ll=0.0; 29 for(int j=0;j<i;j++) 30 { 31 ll=max(ll,p[j].right-fabs(p[i].len-p[j].len)/gen2); 32 } 33 p[i].left=ll; 34 p[i].right=ll+p[i].len*gen2; 35 } 36 for(int i=0;i<T;i++) 37 { 38 for(int j=0;j<i;j++) 39 { 40 if(p[i].len>p[j].len&&p[i].left<p[j].right) 41 p[j].right=p[i].left; 42 if(p[i].len<p[j].len&&p[i].left<p[j].right) 43 p[i].left=p[j].right; 44 } 45 } 46 for(int i=0;i<T;i++) 47 { 48 if(p[i].right-p[i].left>eps) 49 printf("%d ",i+1); 50 } 51 printf("\n"); 52 } 53 return 0; 54 }
Kadj Squares POJ - 3347 (正方形 长度覆盖)
原文:https://www.cnblogs.com/Vampire6/p/12208019.html