Kadj Squares POJ - 3347 (正方形 长度覆盖)

Kadj Squares  POJ - 3347 

 

 题目链接: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 }

猜你喜欢

转载自www.cnblogs.com/Vampire6/p/12208019.html