您是一名工人,负责管理一组桥梁,连接一个由“节点”组成的方形网格:
N - N - N
| | |
N - N - N
| | |
N - N - N(这里的网格是3乘3,但它们可以更大)。
从1到10,每个桥都有固定的容量,每个桥上都有许多汽车,从1到10也是如此。
当一座桥具有n容量和m汽车,而n小于m时,崩溃所需的时间是:
m + n
ceil( ----- )
m - n你必须从其他桥梁中拿出材料(并因此减少桥梁的容量),并准时到达这些桥梁以修复它们!要从桥上获得材料,你必须通过它。例如,以这个小安排为例:
A - BA和B (我们称之为AB)之间的桥梁具有3容量,假设您使用的是A,并且希望使用1材料。要获得这些材料,只需从A横穿到B。
注意:你不需要多次过桥就能得到多种材料,你可以一次从一座桥上拿出你想要的多少材料,只要它不会导致桥梁开始倒塌。
现在,AB有2容量,还有1材料。不过,您只能跨越“安全”的桥梁(或者如果您正在修复桥梁,请在下一段中对此进行解释)。
要修复一座桥,你必须通过它,从而沉积所有需要的材料,以修复桥梁。例如,在上面的例子中,如果AB目前有1容量和2汽车,而你身上有2材料,那么一旦你过了桥,你就会得到1材料,因为这就是修复桥所需要的全部。
在桥梁倒塌之前,你必须完全穿过坍塌的桥,否则它就会断裂。每过一座桥都需要1小时,桥梁倒塌所需的时间如上面的公式所示。例如:
A
|
B
|
C - D在本例中,如果您的起始节点是A,而CD的“寿命”只有2小时,那么桥在到达它之前就会崩溃(过AB需要1小时,过BC需要再花1小时)。
您的任务是创建一个程序来计算,给定一个桥梁列表,该列表将自己表示为两个元素的列表(第一个元素是容量,第二个元素是桥上的汽车),无论是否可能修复所有的桥梁。这些桥梁从上到下,从左到右-所以输入
[[3 2] [3 2] [2 5] [5 1]]这意味着实际的网格如下所示:
3
A --- B
| 2 |
3|2 2|5
| 5 |
C --- D
1因此,AB具有3和2 cars的容量,AC具有3和2 cars的容量,BD具有2和5 cars的容量,CD具有5和1 car的容量。
10 * 10网格。[[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)这是密码-高尔夫,所以以字节为单位的最短代码将获胜!
发布于 2022-05-21 00:36:12
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 0https://codegolf.stackexchange.com/questions/121998
复制相似问题