首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >别把桥弄坏了!

别把桥弄坏了!
EN

Code Golf用户
提问于 2017-05-22 08:59:32
回答 1查看 531关注 0票数 12

简介:

您是一名工人,负责管理一组桥梁,连接一个由“节点”组成的方形网格:

代码语言:javascript
复制
N - N - N
|   |   |
N - N - N
|   |   |
N - N - N

(这里的网格是3乘3,但它们可以更大)。

110,每个桥都有固定的容量,每个桥上都有许多汽车,从110也是如此。

  • 如果一座桥的通行能力高于该桥上的汽车数量,那么它就被认为是“安全的”,你可以通过它。
  • 如果一座桥的通行能力和通过它的车辆数量相等,那么它就被认为是“稳定的”。它不会倒塌,但你不能越过它。
  • 如果一座桥的容量低于该桥上的汽车数量,那么它就被认为是“坍塌”,而你只有有限的时间来修复它。

当一座桥具有n容量和m汽车,而n小于m时,崩溃所需的时间是:

代码语言:javascript
复制
      m + n
ceil( ----- )
      m - n

你必须从其他桥梁中拿出材料(并因此减少桥梁的容量),并准时到达这些桥梁以修复它们!要从桥上获得材料,你必须通过它。例如,以这个小安排为例:

代码语言:javascript
复制
A - B

AB (我们称之为AB)之间的桥梁具有3容量,假设您使用的是A,并且希望使用1材料。要获得这些材料,只需从A横穿到B

注意:你不需要多次过桥就能得到多种材料,你可以一次从一座桥上拿出你想要的多少材料,只要它不会导致桥梁开始倒塌。

现在,AB2容量,还有1材料。不过,您只能跨越“安全”的桥梁(或者如果您正在修复桥梁,请在下一段中对此进行解释)。

要修复一座桥,你必须通过它,从而沉积所有需要的材料,以修复桥梁。例如,在上面的例子中,如果AB目前有1容量和2汽车,而你身上有2材料,那么一旦你过了桥,你就会得到1材料,因为这就是修复桥所需要的全部。

在桥梁倒塌之前,你必须完全穿过坍塌的桥,否则它就会断裂。每过一座桥都需要1小时,桥梁倒塌所需的时间如上面的公式所示。例如:

代码语言:javascript
复制
A
|
B
|
C - D

在本例中,如果您的起始节点是A,而CD的“寿命”只有2小时,那么桥在到达它之前就会崩溃(过AB需要1小时,过BC需要再花1小时)。

任务:

您的任务是创建一个程序来计算,给定一个桥梁列表,该列表将自己表示为两个元素的列表(第一个元素是容量,第二个元素是桥上的汽车),无论是否可能修复所有的桥梁。这些桥梁从上到下,从左到右-所以输入

代码语言:javascript
复制
[[3 2] [3 2] [2 5] [5 1]]

这意味着实际的网格如下所示:

代码语言:javascript
复制
    3
 A --- B
 |  2  |
3|2   2|5
 |  5  |
 C --- D
    1

因此,AB具有32 cars的容量,AC具有32 cars的容量,BD具有25 cars的容量,CD具有51 car的容量。

规则/规范:

  • 您的程序必须至少适用于10 * 10网格。
  • 您的程序可以将输入接受为带有任何分隔符的字符串或列表列表(参见示例I/O)。
  • 对于所有真值,您的程序必须输出相同的true值,对于所有假值,它必须输出相同的false值。
  • 您可以提交完整的程序或函数。

示例I/O:

代码语言:javascript
复制
[[5 5] [5 5] [1 1] [3 3]] => true
[[2 5] [2 2] [3 3] [1 2]] => false
[[3 2] [3 2] [2 5] [5 1]] => true

NOTE, you can take the input like this as well:
[[3, 2], [3, 2], [2, 5], [5, 1]] (Python arrays)
3,2,3,2,2,5,5,1                  (Comma-separated string)
3 2 3 2 2 5 5 1                  (Space-separated string)

这是密码-高尔夫,所以以字节为单位的最短代码将获胜!

EN

回答 1

Code Golf用户

发布于 2022-05-21 00:36:12

Python3,560字节:

代码语言:javascript
复制
R=range
def V(b,x,y,X,Y):
 try:return[(b[x][y],b[x+X][y+Y])]
 except:return[]
def f(r):
 K,w=0,int(len(r)**.5);b=[[K:=K+1for _ in R(w)]for _ in R(w)];e=dict(zip([l for x in R(w)for y in R(w)for l in V(b,x,y,0,1)+V(b,x,y,1,0)],r));q=[(e,0)]
 while q:
  e,c=q.pop(0);E=e.values()
  if all(a>=b for a,b in E):return 1
  if c<min(-(-((b+a)/(b-a))//1)for a,b in E if a<b):
   for(j,k),(a,b)in e.items():
    if a>b:
     for J,K in e:
      if(j,k)!=(J,K)and{j,k}&{J,K}:
       for s in R(a-b):
        Q=eval(str(e));Q[j,k][0]-=s;Q[J,K][0]+=s;q+=(Q,c+1),
 return 0

在网上试试!

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/121998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档