建楼问题

题目描述:

在我们所知的一些高层建筑中(如迪拜塔),它的每层面积随着高度的增大而减小。在现代化的建设中,采用模块化建设可以简化建筑过程并减少工期。我们假定我们将要建筑一幢高 N 层的大楼,采用模块化建设(每一层为一个模块),每一天会运来其中一个模块。但由于调度上的失误,导致当天运来的模块并不一定是放在最下面的,这种情况下那一天就不会进行任何建设,而是要等到下层都建设好以后这一层的模块才会放上去。为简化问题,我们假定上一层的面积比下一层小 1。

输入描述:

每一组数据包含两行,第一行为一个非零正整数 N (1 <= N <= 100000)。
第二行为 N 个数, 第 i 个数代表第 i 天运来的模块面积, 1 <= ai <= N,且这 N 个数不会重复。

输出描述:

输出 N 行,每一行为当天的工程进度,输出当天建设的那几个面积层,从大到小排列,以空格隔开。
如当天没有进行任何建设,则输出一个空行。

示例:

输入:

1
3
3 1 2

输出:

3

2 1
解题思路:

先建立一个大小为 N 的数组 out,全部标记为 False。遍历输入的 N 个数,每次将一个输入的数加入到 out 数组的对应位置,并标记为 True。接下来,循环判断当前期望输出的值 expect 是否在 out 数组中 (被标记为 True),则打印 expect,并减 1 继续判断;否则,就打印一个空行。

Python 实现:
def solve(N, li):
    out = [False] * (N + 1)
    expect = N
    for k, v in enumerate(li):
        out[v] = True
        while out[expect]:
            print(expect, end=" ")
            expect -= 1
        else:
            print()

N = int(input())  # 6
li = [int(n) for n in input().split(" ")]  # 4 2 3 6 5 1
solve(N, li)  # \n \n \n 6\n 5 4 3 2\n 1

你可能感兴趣的:(建楼问题)