POJ - 3347 Kadj Squares(思维+几何)

题目链接:点击查看

题目大意:给出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;
}
发布了577 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_45458915/article/details/104096585