Kadj Squares POJ - 3347
原创
©著作权归作者所有:来自51CTO博客作者DeathYmz的原创作品,请联系作者获取转载授权,否则将追究法律责任
Kadj Squares POJ - 3347
题意:给出正方形的边长序列,问从上面看,能看到哪些正方形。
思路:没有思路,看了题解,emmm。参考博客
#include<iostream>
#include<cstdio>
#include<cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=55;
struct node{
int l,r,len;//图形扩大。变成变为根号2*len
}date[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
memset(date,0,sizeof(date));
for(int i=0;i<n;i++)
{
scanf("%d",&date[i].len);
//存储l,r的位置
for(int j=0;j<i;j++)//求出的排列
date[i].l=max(date[i].l,date[j].r-abs(date[i].len-date[j].len));//样例1的s3和s4
date[i].r=date[i].l+2*date[i].len;
/*abs那段是两个图形的重叠部分
但是只有真正重合的j能求出真正的l也就是最大的l
等腰三角形指的是以x周为斜边的那个 两个45度*/
}
for(int i=0;i<n;i++)//判断重叠
{
for(int j=0;j<i;j++)
{
if(date[i].l<date[j].r)//重叠
{
if(date[j].len<date[i].len)//右边大 j被覆盖一些
date[j].r=date[i].l;
else//左边大 i被覆盖
date[i].l=date[j].r;
}
}
}
bool flag=0;
for(int i=0;i<n;i++)
{
if(date[i].l<date[i].r)
{
if(!flag) printf("%d",i+1),flag=1;
else printf(" %d",i+1);
}
}
printf("\n");
}
return 0;
}