题目链接:点击查看
题目大意:给出n个正方形的边长,每个正方形必须与x轴有交点,且交点必须小,还需要满足每个正方形与x的交点依次递增,在满足以上条件的前提下,将所有的正方形防止在二维平面上,现在问从x轴上方向下俯视,能直接看到哪些正方形
题目分析:伪装成几何题目的思维题,用到的几何知识无非是坐标转换,更多的是思维,因为题目的要求限制了正方形摆放的方式唯一,我们可以将每个正方形抽象成一个线段,计算出每个正方形的左右端点以及长度,为了方便计算起见,将长度统一视为边长除以根号二的结果,这样就能直接以平行于x轴的长度来计算了,具体的计算方法见代码,等计算好后再与其他的正方形相比较,看看是否被遮挡,因为正方形的高度与其边长成正比,所以当两个正方形的线段重合时,无疑是长度较大的遮挡了长度较小的,实时更改其左右端点,最后依靠左右端点就能判断出答案了
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const int N=60;
struct Node
{
int l,r,len;
}a[N];
int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].len);
a[i].l=0;
for(int j=1;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+2*a[i].len;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
if(a[j].r>a[i].l&&a[j].len>a[i].len)
a[i].l=a[j].r;
for(int j=i+1;j<=n;j++)
if(a[j].l<a[i].r&&a[j].len>a[i].len)
a[i].r=a[j].l;
}
for(int i=1;i<=n;i++)
if(a[i].l<a[i].r)
printf("%d ",i);
putchar('\n');
}
return 0;
}