题目大意:给一些序列的正方形的边长,然后让这个正方形倾斜45度,放在第一象限,一个角要紧挨着x轴,按照输入的顺序放下去,然后问最后从上往下看可以看到那些正方形?
分析:不能算是计算几何题......先求出来这个正方形的左右两端的位置,然后判断是否有比它高的正方形把它掩盖住就行了,为了避免浮点运算,可以用2*len当做对角线,也就是把所有边的长度扩大了sqrt(2)倍
代码如下:
========================================================================================================================================
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; const int MAXN = 107; const double EPS = 1e-8; struct Line{int L, R, len;}a[MAXN]; int main() { int N; while(scanf("%d", &N) != EOF && N) { memset(a, 0, sizeof(a)); for(int i=0; i<N; i++) { scanf("%d", &a[i].len); for(int j=0; j<i; j++) a[i].L = max(a[i].L, a[j].R-abs(a[j].len-a[i].len)); a[i].R = a[i].L + a[i].len * 2; } for(int i=0; i<N; i++) { for(int j=0; j<i; j++) { if(a[i].L < a[j].R && a[i].len < a[j].len) a[i].L = a[j].R; } for(int j=i+1; j<N; j++) { if(a[i].R > a[j].L && a[i].len < a[j].len) a[i].R = a[j].L; } } for(int k=0, i=0; i<N; i++) { if(a[i].L < a[i].R) { if(k++)printf(" "); printf("%d", i+1); } } printf(" "); } return 0; }