POJ 3347 Kadj Squares (计算几何+线段相交)
题意:从左至右给你n个正方形的边长,接着这些正方形都按照旋转45度以一角为底放置坐标轴上,最左边的正方形左端点抵住y轴,后面的正方形依次紧贴前面所有正方形放置,问从上方向下看去,有哪些正方形是可以被看到的(如图)

题解:首先找到每个正方形左右端点的坐标转化为一条线段,接着寻找哪些线段被其他某些条线段覆盖,那这些被覆盖的线段就不能被看到了
寻找被覆盖的线段利用区间贪心,我们按照左端点升序、左端点相同右端点降序排序,则左端点一定被前面的线段覆盖,接着对于右端点使用单调栈的思想寻找可以看到的线段就好
找左端点时就将此正方形与之前的每个正方形紧贴找最大的值(关键)
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=<<;
const ll INF=1ll<<;
const double Pi=acos(-1.0);
const int Mod=1e9+;
const int Max=;
int num[Max],vis[Max];
int line[Max];
struct node
{
int x,y,pos;
} lin[Max];
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.y>b.y;
return a.x<b.x;
}
int Jud(int n)
{
int coun=;
for(int i=; i<n; ++i)
{
lin[i].x=line[i],lin[i].y=line[i]+num[i],lin[i].pos=i+;
}
sort(lin,lin+n,cmp);
vis[coun++]=;
node now=lin[];
for(int i=;i<n;++i)
{
if(lin[i].y>now.y)
{
for(int j=coun-;j>=;--j)
{
if(lin[i].x<=lin[vis[j]].y)//找之前的lin(不一定连续)
coun--;
else
break;
}
now=lin[i];
vis[coun++]=i;//注意这儿记录的值
}
}
for(int i=;i<coun;++i)
vis[i]=lin[vis[i]].pos;
sort(vis,vis+coun);
return coun;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
for(int i=; i<n; ++i)
{
scanf("%d",&num[i]);
num[i]*=;//边长变成对角线,但是同比例扩大sqrt(2.0)后就变成2倍了
}
line[]=;
for(int i=; i<n; ++i)
{
line[i]=;
for(int j=; j<i; ++j)
{
int tem=num[j]-abs(num[i]-num[j])/+line[j];//与每个之前的正方形紧贴在一起的x轴坐标
line[i]=max(line[i],tem);//一定是x轴最大的值
}
}
int coun=Jud(n);
for(int i=; i<coun; ++i)
printf("%d%c",vis[i],i==coun-?'\n':' ');
}
return ;
}
POJ 3347 Kadj Squares (计算几何+线段相交)的更多相关文章
- POJ 3347 Kadj Squares 计算几何
求出正方形的左右端点,再判断是否覆盖 #include <iostream> #include <cstdio> #include <cstring> #inclu ...
- POJ 3347 Kadj Squares
Kadj Squares Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2132 Accepted: 843 Descr ...
- POJ 3347 Kadj Squares (计算几何)
题目: Description In this problem, you are given a sequence S1, S2, ..., Sn of squares of different si ...
- POJ 3347 Kadj Squares (线段覆盖)
题目大意:给你几个正方形的边长,正方一个顶点在x轴上然后边与x轴的夹角为45度,每个正方形都是紧贴的,问从上面看能看的正方形的编号 题目思路:线段覆盖,边长乘上2防止产生小数,求出每个正方形与x轴平行 ...
- 简单几何(线段覆盖) POJ 3347 Kadj Squares
题目传送门 题意:告诉每个矩形的边长,它们是紧贴着的,问从上往下看,有几个还能看到. 分析:用网上猥琐的方法,将边长看成左端点到中心的距离,这样可以避免精度问题.然后先求出每个矩形的左右端点,然后如果 ...
- [poj] 3347 Kadj Square || 计算几何的“线段覆盖”
原题 多组数据,给出n个正方形的边长,使他们以45度角倾斜的情况下最靠左(在第一象限内),如图.求从上看能看到哪几个完整的正方形. 借鉴于https://www.cnblogs.com/Ritchie ...
- POJ 1066 Treasure Hunt (线段相交)
题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ...
- POJ 2653 Pick-up sticks (线段相交)
题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...
- POJ 2653 Pick-up sticks【线段相交】
题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...
随机推荐
- synthesize的作用
@synthesize是对属性的实现,实际上就是制定setter和getter操作的实例变量的名称 举个栗子: @synthesize array; 默认操作的实例变量和属性同名 @synthe ...
- 参加SFDC的感触
今天参加了SFDC. 第一次参加这样的技术大会,感触总是有点. 简单的记录如下 1.自动化运维在行业已经成为趋势,未来DevOps 作为开发和运维统一已经是新时代对开发人员的要求.公司架构一个自己的自 ...
- Android日记-SimpleAdapter和BaseAdapter
SimpleAdapter 这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图.你可以指定由Map组成的List(比如ArrayList)类型的数据.在ArrayList中的每个条目对 ...
- Thinkphp 3.2.2 验证码check_verify方法,只能验证一次
问题: Thinkphp 3.2.2 验证码check_verify方法,只能验证一次. function check_verify($code, $id = ''){ $verify = \Thin ...
- (原创)微信支付SDK调用的核心代码与分析(基于Android)
先上代码,后面会分析 String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android"; ...
- PHP 文件夹操作「复制、删除、查看大小」迭代实现
"既然递归能很好的解决,为什么还要用迭代呢"?主要的原因还是效率问题-- 递归的概念是函数调用自身,把一个复杂的问题分解成与其相似的多个子问题来解决,可以极大的减少代码量,使得程序 ...
- ajax简单应用
var xmlhttp;if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码 xmlhttp=new ...
- C#夯实基础之多线程一:初识多线程
一. 烧水沏茶问题 在小学四年级有一个烧水沏茶问题,可以作为我们今天讨论话题的引子: 客人来了,要烧一壶茶,但是烧水需要5分钟,洗水壶需要1分钟,洗茶杯需要2分钟,接水需要1分钟,找茶叶需 ...
- Moving Average from Data Stream
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- js调用php和php调用js的方法举例
js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...