题意 : 给你n个正方形每个正方形斜45度摆放,给你正方形的边长,从上向下看问你能看到哪些正方形。
题解 :
- 首先我们发现正方形最大能看到的长度对应着x轴上的对角线的长度。
- 发现了这个以后我们就要想办法求出对角线最左和最右边的点的坐标,求坐标的时侯我们发现长度都带着根号2这个时候为了运算的精度我们就给所有的数都乘以一个根号2就可以了。
- 画图可以找出求最左最右边坐标的方法。
- 这种问题常常考虑能看到的最大情况是什么样子,然后对于这种最大的情况进行判断。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int maxn = 1005;
struct point {
int len;
int rig;
int lef;
}p[maxn];
int n;
int res[maxn] = {0};
int main () {
ios_base :: sync_with_stdio(false);
while (cin >> n && n) {
for (int i = 1;i <= n; ++ i) {
cin >> p[i].len;
p[i].lef = 0;
for (int j = 1;j < i; ++ j) {
p[i].lef = max (p[i].lef,p[j].rig - abs (p[i].len - p[j].len));
}
p[i].rig = p[i].lef + p[i].len * 2;
for (int j = 1;j < i; ++ j) {
if (p[i].len > p[j].len && p[i].lef < p[j].rig) {
p[j].rig = p[i].lef;
}
else if (p[i].len < p[j].len && p[i].lef < p[j].rig)
p[i].lef = p[j].rig;
}
}
int tot = 0;
for (int i = 1;i <= n; ++ i) {
if (p[i].lef < p[i].rig) {
res[tot ++] = i;
}
}
cout << res[0] ;
for (int i = 1;i < tot; ++ i) {
cout << ' ' << res[i];
}
cout << endl;
}
return 0;
}