在 Kattis 上识别地图图块超过了时间限制

Posted

技术标签:

【中文标题】在 Kattis 上识别地图图块超过了时间限制【英文标题】:Time limit exceeded in Identifying Map Tiles on Kattis 【发布时间】:2021-07-06 06:30:47 【问题描述】:

我正在尝试解决问题:在 kattis 中识别地图块。

https://open.kattis.com/problems/maptiles2

我得到了正确的答案,直到第 6 次测试我一直收到超出时间限制的错误。

这是我的代码,我不确定有什么问题。我可以做些什么来优化它,让它运行得更快?

#! /usr/bin/env python3
import sys
s=sys.stdin.read().splitlines()

quadkey=s[0]

zoom_level=len(quadkey)

#Lists of x and y cordinates
x_cords=[]
y_cords=[]
for i in range(2**zoom_level):
    x_cords.append(i)
    y_cords.append(i)

#Try to loop through the quadkey and locate the cordinates
for i in range(len(quadkey)):
    half=int(len(x_cords)/2)
    if quadkey[i]=='0':
        x_cords=x_cords[:half]
        y_cords=y_cords[:half]
    elif quadkey[i]=='1':
        x_cords=x_cords[half:]
        y_cords=y_cords[:half]
    elif quadkey[i]=='2':
        x_cords=x_cords[:half]
        y_cords=y_cords[half:]
    elif quadkey[i]=='3':
        x_cords=x_cords[half:]
        y_cords=y_cords[half:]

x_cord=x_cords[0]
y_cord=y_cords[0]
print(zoom_level, x_cord, y_cord)

【问题讨论】:

【参考方案1】:

蛮力方法不起作用的原因是上限是 230 或 1073741824。这是一个必须创建和循环的大网格,更不用说你正在做在每次迭代时切片(那些是涉及循环和内存分配的副本)。

更好的方法是找到模式并进行逻辑计算。我的方法是通过四键向后循环,将每个数字视为其平方内的二次方偏移量。

最里面/最右边的四键数字没有偏移;这是最紧的盒子。计算正确的偏移量只需在 x 和/或 y 轴上增加 1。

接下来是右数第二个四键数字。这个数字决定了 4 个最小的盒子在 8 个单位的盒子内的偏移量(我们已经在步骤 1 中计算出该盒子的象限并将其添加到结果中)。为了找出 8 的方框中的哪个象限,我们需要将结果的 x 和/或 y 轴偏移 2。

接下来是从右数第三个四键数字。这个数字确定了 16 个单位的框内的偏移量,它限制了我们已经计算过偏移量的两个较小的框。要确定方框 16 中的哪个象限,我们需要将结果的 x 和/或 y 轴偏移 4。

你能看到图案吗?我们将 2 的幂作为乘数来确定从右侧的每个偏移量,1 * 20 = 1, 1 * 21 = 2, ...

如果仍然不清楚,我建议花一些时间查看提供的 Kattis 图表,以帮助说明此处的方法。

代码如下:

quadkey = input()
#                     top-left        bottom-left
quadkey_multipliers = (0, 0), (1, 0), (0, 1), (1, 1)  # x, y
#                             top-right       bottom-right
x, y = 0, 0

for level, k in enumerate(reversed(quadkey)):
    xx, yy = quadkey_multipliers[int(k)]
    x += xx * 2 ** level
    y += yy * 2 ** level

print(len(quadkey), x, y)

当然,方向对于问题并不重要;你也可以向前迭代,在循环中使用x += xx * 2 ** (len(quadkey) - level - 1),但我觉得从 4 号盒子向后工作是最容易推理的。

【讨论】:

【参考方案2】:

Kaddis 有专门设计为无法通过蛮力方法解决的问题,因此通常,您必须研究问题并找到算法不同的解决方案。我建议研究一下这个案例,找到正确的捷径。

【讨论】:

这不应该是评论吗?

以上是关于在 Kattis 上识别地图图块超过了时间限制的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 osmdroid 中使用 Google 地图图块吗?

根据半径限制引脚数量?

分享几个好玩的Qt项目

离线地图图块已停止显示

在 Google 地图中的地图图块上触发悬停

在地图图层上设置速度限制