题目链接:poj.org/problem?id=3347

In this problem, you are given a sequence S1, S2, ..., Sn of squares of different sizes. The sides of the squares are integer numbers. We locate the squares on the positive x-y quarter of the plane, such that their sides make 45 degrees with x and y axes, and one of their vertices are on y=0 line. Let bi be the x coordinates of the bottom vertex of Si. First, put S1 such that its left vertex lies on x=0. Then, put S1, (i > 1) at minimum bi such that

  • bi > bi-1 and
  • the interior of Si does not have intersection with the interior of S1...Si-1.

The goal is to find which squares are visible, either entirely or partially, when viewed from above. In the example above, the squares S1, S2, and S4 have this property. More formally, Si is visible from above if it contains a point p, such that no square other than Si intersect the vertical half-line drawn from p upwards.

Input

The input consists of multiple test cases. The first line of each test case is n (1 ≤ n ≤ 50), the number of squares. The second line contains n integers between 1 to 30, where the ith number is the length of the sides of Si. The input is terminated by a line containing a zero number.

Output

For each test case, output a single line containing the index of the visible squares in the input sequence, in ascending order, separated by blank characters.

Sample Input

4
3 5 1 4
3
2 1 2
0

Sample Output

1 2 4
1 3

题目翻译:

在这个问题中,你被赋予一个‎‎序列S‎‎1‎‎, ‎‎S‎‎2‎‎, ..., S ‎‎n‎‎的正方形不同大小.正方形的两侧是整数。我们定位平面正‎‎x‎‎-‎‎y‎‎四分之一上的正方形,这样它们的两侧使用‎‎x‎‎轴和‎‎y‎‎轴进行 45 度,并且其中一个顶点位于‎‎y‎‎=0 线上。让‎‎b‎‎i‎‎是‎‎S‎‎i‎‎的底部顶点的‎‎x‎‎坐标。首先,将‎‎S‎‎1‎‎放在 x =0 上,使其左顶点位于‎‎x‎‎=0 上。然后,将‎‎S‎‎1‎‎,(i‎‎ > 1) 放在至少‎‎b‎‎i‎‎上,这样,‎

  • ‎b‎‎i‎‎ ‎‎ > ‎‎b‎‎i‎‎-1‎‎和‎
  • ‎S‎‎的内部‎‎没有与‎‎S‎‎1‎‎的内部交叉 ...‎‎S‎‎ ‎‎i‎‎-1‎‎.‎

‎目标是从上面查看时,找到完全或部分可见的方块。在上面的示例中,正方形 S ‎‎1、S‎‎ ‎‎2‎‎和‎‎S‎‎4‎‎具有此属性。更正式的是,‎‎如果 S‎‎i‎‎包含点‎‎p,‎‎则从上面可以看到,这样,除了‎‎S‎‎i‎‎之外,没有任何正方形与从‎‎p‎‎向上绘制的垂直半线相交。‎

‎输入‎

‎输入由多个测试用例组成。每个测试用例的第一行是‎‎n‎‎ (1 = ‎‎n‎‎ = 50),平方数。第二行包含‎‎1‎‎到 30 之间的 n 个整数,其中‎‎i‎‎编号是‎‎S‎‎i‎‎的边的长度。输入由包含零数的行终止。‎

‎输出‎

‎对于每个测试用例,输出一行包含输入序列中可见方块的索引,按升序,由空白字符分隔。

有一种比较简单的做法,记录一下正方形的左右端点和长度,并且投影到x轴,就相当于求区间覆盖了。

不过区间覆盖有两种情况:左边覆盖和右边覆盖。

求当前点的左端点时,可以得出 左端点 L = 前面最大右端点maxR - 两正方形边长之差。

有一个小技巧,在求出左端点后,右端点直接等于左端点+长度乘于2,相当于都扩大sqrt(2)倍,也就是投影到x轴之后的长度,其实都扩大就不影响结果了。

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
struct point{int l,r,len;
}p[55];
int main(){int n;while(~scanf("%d",&n)){if(!n) break;for(int i=1;i<=n;i++){scanf("%d",&p[i].len);p[i].l=0;for(int j=1;j<i;++j)p[i].l=max(p[i].l,p[j].r-abs(p[j].len-p[i].len));//当前左边的端点等于前面所有最大的右端点减去边长之差 p[i].r=2*p[i].len+p[i].l;//相当于同时扩大了sqrt(2)倍 }for(int i=1;i<=n;i++){for(int j=1;j<i;++j)//找左边 if(p[i].l<p[j].r&&p[i].len<p[j].len)//左边点与当前点有重叠部分 p[i].l=p[j].r;for(int j=i+1;j<=n;++j)//找右边 if(p[i].r>p[j].l&&p[i].len<p[j].len)//右边点与当前点有重叠部分 p[i].r=p[j].l;}int first=1;for(int i=1;i<=n;i++){if(p[i].l<p[i].r&&first){printf("%d",i);first=0;continue;}if(p[i].l<p[i].r&&!first)printf(" %d",i);}printf("\n");            }return 0;
}

poj3347——正方形覆盖(区间覆盖)相关推荐

  1. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

  2. HDU - 3974 Assign the task (DFS建树+区间覆盖+单点查询)

    题意:一共有n名员工, n-1条关系, 每次给一个人分配任务的时候,(如果他有)给他的所有下属也分配这个任务, 下属的下属也算自己的下属, 每次查询的时候都输出这个人最新的任务(如果他有), 没有就输 ...

  3. UVA10020(最小区间覆盖)

    题意:       给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来. 思路:       算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以 ...

  4. 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...

    HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...

  5. 高效算法——E - 贪心-- 区间覆盖

    E - 贪心-- 区间覆盖 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 解题思路: 贪心思想, ...

  6. P2082 区间覆盖(加强版)

    基础刷起来.水题刷起来... 其实区间覆盖的模板应该背这个... 同样维护left和right,只不过最后要加上r-l+1.里面维护的就有点不一样. 代码: #include<cstdio> ...

  7. *【UVA - 10382】Watering Grass(贪心,区间覆盖问题,思维)

    题干: 题目大意: 有一块草坪,长为l,宽为w,在它的水平中心线上有n个位置可以安装喷水装置,各个位置上的喷水装置的覆盖范围为以它们自己的半径ri为圆.求出最少需要的喷水装置个数,如果无论如何都不能覆 ...

  8. 【UVA - 10020 】Minimal coverage (贪心,区间覆盖问题)

    题干:(Uva题不给题干了) t组样例,每组首先给出一个M,然后给出一些线段(0 0结束),然后问怎么取能使得最少的线段覆盖区间[0, M]. Sample Input 2 1 -1 0 -5 -3 ...

  9. 【HDU - 1698】 Just a Hook(线段树模板 区间覆盖更新(laz标记) + 区间和查询 )

    题干: In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroe ...

最新文章

  1. Linux下安装Redis php-redis扩展 redis重启shell脚本 超详细!
  2. bzoj 1572: [Usaco2009 Open]工作安排Job
  3. PowerDesigner 小工具窗
  4. MyBatis多对多关联查询示例——MyBatis学习笔记之十八
  5. C/Cpp / 类的前向声明、不完全类型和完全类型
  6. 系统架构设计师教程学习随笔 (计算机与网络基础知识--操作系统基础知识)
  7. jquery里面的$(this)和this都什么时候用,有什么区别
  8. JavaFX UI控件教程(十四)之Tree View
  9. java 16进制整数,Java将整数转换为十六进制整数
  10. DataBseDesign工作笔记004---PowerDesigner导入sql脚本生成物理模型
  11. 返回值由hresult变为void型_java高级之泛型
  12. python反转数字_[蓝桥杯]使用列表反转的回文数(Python代码),数字,利用,取反
  13. 华硕 tuf b360 efi_技嘉小雕、微星迫击炮、华硕电竞特工三款主板对比
  14. node 压缩图片_6大免费图片压缩神器你值得拥有!
  15. 我在华为度过的 “两辈子”(学习那些在大厂表现优秀的人)
  16. 微信小程序 老男孩课程(day1-2.5 到django不会了..要学Pythone)
  17. 医疗his系统值不值得投入使用
  18. Linux ssh远程连接
  19. 徐宗本院士讲座《关于大数据研究下的若干问题》摘记
  20. java中什么是空指针异常以及为什么会产生空指针异常

热门文章

  1. 通过Js来设置页面样式
  2. 通过淘口令获取Url链接
  3. 用LangChain构建大语言模型应用
  4. 第一章计算机系统概述答案,1第一章计算机系统概论.ppt
  5. 微信图片转文字的方法有哪些
  6. 【WAF剖析】——文件上传之安全狗bypass
  7. 关于使用Windows10系统,使用LR11录制app脚本的方法说明
  8. git时光穿梭机---女神的侧颜
  9. Arduino - 驱动HC-SR501 人体红外感应模块
  10. 图情论文笔记 | 智慧图书馆下的阅读推广服务策略