Саботаж поїзда, щоб він пізно пішов [закрито]


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
Я голосую за те, щоб закрити це питання поза темою, тому що недостатньо чіткі виклики - це поза темою на цей погляд
Rohan Jhunjhunwala

Відповіді:


2

Python 3 (не 2)

Редагувати: я зніму це зранку, на жаль.

Це абсолютно нормальний пошук зірки A. Правильно? 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.