Саботировать поезд, чтобы он опаздывал [закрыто]


15

«Я хочу пойти на арабский базар, чтобы купить подарок для того, в кого влюбился. Однако, если я приеду слишком поздно, все магазины будут закрыты, и я не смогу ничего купить. Вы можете помочь? я? "

Цель: доставить мальчика в Араби с Северной Ричмонд-стрит до того, как все магазины закроются.
Фактическая цель: убедиться, что мальчик не прибыл в Араби до закрытия магазинов.

Ваша программа примет входные данные в следующем формате:

<time> <map>

где

  • <time>максимальное время, которое мальчик может провести в путешествии, в минутах. Это положительное целое число.
  • <map> график маршрутов, по которым может идти поезд

Вот как работает формат графика:

  • Каждое утверждение заканчивается точкой с запятой.
  • Узлы на карте (которые представляют переключатели) представлены с использованием одинарных строчных букв.
  • Путь между узлами представлен синтаксисом a,X,b, где Xцелое число представляет вес пути. Вес пути - это время в минутах, которое поезд проходит через эти два узла.
  • Араби представлена ​​с a, а Северная Ричмонд-стрит представлена ​​с n.
  • Все пути являются двунаправленными.

Например, этот график (представьте, что пути двунаправленные):

график
Изображение Артема Калинина, через Wikimedia Commons. Используется по лицензии CC BY-SA 3.0 .

будет записано в графе обозначения как:

a,4,b;a,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,f;

Обратите внимание, что этот вход не имеет n, поэтому это неверный ввод. Ваша программа может делать что угодно, если введено неверное значение.

Вот пример ввода:

21 n,4,b;n,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,a;

(Это тот же график, что и на изображении выше, с aзаменой на nи fзаменой на a).

Мальчик должен добраться с точностью nдо a21 минуты. Если он пойдет по маршруту n-> c-> e-> d-> a, он доберется туда за 20 минут, что вовремя. Мы могли бы представить этот маршрут как список узлов через запятую:

n,c,e,d,a

С другой стороны, маршрут n-> b-> c-> e-> d-> aзаставит мальчика занять 27 минут, что не вовремя. Мы могли бы представить этот маршрут так:

n,b,c,e,d,a

Другой возможный маршрут, который заставит мальчика не успеть вовремя:

n,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,e,d,a

Ваша программа должна принимать данные, как описано выше, и на первый взгляд кажется, что они выводят маршрут, который заставит мальчика сделать это вовремя, но фактически выводят маршрут, который заставляет мальчика не делать это вовремя. Для любого заданного входа всегда будет существовать маршрут без обратного отслеживания, который заставляет мальчика не успеть вовремя.

Это закулисный конкурс популярности, поэтому выигрывает участник с наибольшим количеством голосов. Голоса присуждаются за изобретательность в сокрытии ошибки - чем менее очевидна, тем лучше.

Вот несколько примеров графиков для тестирования вашей программы.

Входные данные:

12 a,2,c;a,2,e;b,5,c;b,4,d;b,11,e;d,7,n;e,4,n;

Визуальное представление (это визуальное представление только для ясности и не является частью задачи):

Вход 1

Возможно выход:

n,d,b,e,a

Входные данные:

10 a,8,b;a,12,d;b,1,n;d,11,n;a,1,n;

Вот визуальное изображение графика:

Вход 2

Возможно выход:

n,d,a

 


Можем ли мы написать функцию (вместо отдельной программы)?
golfer9338

@ golfer9338 Да. Я предпочел бы программу , если это возможно, но если коварный часть зависит от того , что это функция , то функция разрешена.
абсент

Я спрашиваю, потому что я планирую сделать это в Javascript.
golfer9338

3
Реальный вопрос в том, почему мы стремимся насолить этому влюбленному мальчику? Возможно, он оскорбил нашу семью? Есть ли у нас сами проекты на предмет его привязанности? Мы должны знать!
Клаудиу

3
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что закулисные вызовы не по теме в этом зрелище
Рохан Джунджхунвала

Ответы:


2

Python 3 (не 2)

Редактировать: Я разложу это утром, упс.

Это совершенно нормальный поиск звезд. Правильно? Riiiiiiight? Кажется, работает для всех тестовых случаев.

def a(b,c,d):
    e,f,g=[],{},{}
    f[c]=0
    while f:
        h=sorted(f.keys(),key=lambda z:-f[z],reverse=True)[-1]
        if h==d:break
        e.append(h)
        for z in b[h]:
            if z in e:continue
            if z in f and f[z]>f[h]+b[z][h]:continue
            g[z]=h
            f[z]=f[h]+b[z][h]
        del f[h]
    i=[]
    j=d
    q=0
    while j!=c:
        i.append(j)
        q+=b[j][g[j]]
        j=g[j]
    return q,(i+[c])[::-1]
t,q=input().split(" ")
t=int(t)
q=q[:-1]
q=[i.split(",")for i in q.split(";")]
g={a:{}for a in __import__("functools").reduce(lambda zz,zy:zz+zy,[[v[0],v[2]]for v in q])}
for l in q:g[l[0]][l[2]]=g[l[2]][l[0]]=int(l[1])

r=a(g,'n','a')
print("time-good: %d, time-ours: %d" % (t, r[0]))
print("path: %s" % " -> ".join(r[1]))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.