如图摆放正方形,问从上往下看可以看到哪些正方形,实在想不到怎么求每个正方形的坐标
看到心里只有学习 天下欲倾,利刃安在。 计算几何 poj 3347这个博客才豁然开朗。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int mx = 105;
const double eps = 1e-8;
int n, s[mx], t[mx], ans[mx];
int main() {
while (scanf("%d",&n) && n != 0) {
for (int i = 1; i <= n; i++) {
scanf("%d",&s[i]);
}
t[1] = s[1];
for (int i = 2; i <= n; i++) {
int now = 0;
for (int j = 1; j < i; j++) {
now = max(now, t[j] + 2*min(s[j],s[i]));
}
now = max(now, s[i]);
t[i] = now;
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
int l = 0, r = 0;
for (int j = 1; j < i; j++) {
if (s[j] > s[i])//这个if其实可以去掉的
l = max(l, s[i] + s[j] - (t[i] - t[j]));
}
for (int j = i+1; j <= n; j++) {
if (s[j] > s[i])
r = max(r, s[i] + s[j] - (t[j] - t[i]));
}
if ((l + r) < 2*s[i])
ans[cnt++] = i;
}
for (int i = 0; i < cnt; i++) {
printf("%d%c",ans[i],i==cnt-1?'\n':' ');
}
}
return 0;
}