Задания
Версия для печати и копирования в MS Word
Тип 26 № 59704
i

Вход­ной файл со­дер­жит све­де­ния о за­яв­ках на про­ве­де­ние за­ня­тий в кон­фе­ренц-⁠зале. В каж­дой за­яв­ке ука­за­ны время на­ча­ла и время окон­ча­ния ме­ро­при­я­тия (в ми­ну­тах от на­ча­ла суток). Если время на­ча­ла од­но­го ме­ро­при­я­тия мень­ше вре­ме­ни окон­ча­ния дру­го­го, то про­ве­сти можно толь­ко одно из них. Если время окон­ча­ния од­но­го ме­ро­при­я­тия сов­па­да­ет с вре­ме­нем на­ча­ла дру­го­го, то про­ве­сти можно оба. Опре­де­ли­те мак­си­маль­ное ко­ли­че­ство ме­ро­при­я­тий, ко­то­рое можно про­ве­сти в кон­фе­ренц-⁠зале и самое позд­нее время окон­ча­ния по­след­не­го ме­ро­при­я­тия.

За­да­ние 26

Вход­ные дан­ные.

В пер­вой стро­ке вход­но­го файла на­хо­дит­ся на­ту­раль­ное число N (N < 1000)  — ко­ли­че­ство за­явок на про­ве­де­ние ме­ро­при­я­тий.

Сле­ду­ю­щие N строк со­дер­жат пары чисел, обо­зна­ча­ю­щих время на­ча­ла и время окон­ча­ния ме­ро­при­я­тий. Каж­дое из чисел на­ту­раль­ное, не пре­вос­хо­дя­щее 1440.

За­пи­ши­те в от­ве­те два числа: мак­си­маль­ное  — ко­ли­че­ство ме­ро­при­я­тий, ко­то­рое можно про­ве­сти в кон­фе­ренц-зале и самое позд­нее время окон­ча­ния по­след­не­го ме­ро­при­я­тия (в ми­ну­тах от на­ча­ла суток).

Ти­по­вой при­мер ор­га­ни­за­ции дан­ных во вход­ном файле:

5

10 150

100 110

131 170

131 180

120 130

При таких ис­ход­ных дан­ных можно про­ве­сти мак­си­мум три ме­ро­при­я­тия, на­при­мер, по за­яв­кам 2, 3 и 5. Кон­фе­ренц-⁠зал осво­бо­дит­ся самое позд­нее на 180-⁠й ми­ну­те, если со­сто­ят­ся ме­ро­при­я­тия по за­яв­кам 2, 4, 5.

Ти­по­вой при­мер имеет ил­лю­стра­тив­ный ха­рак­тер. Для вы­пол­не­ния за­да­ния ис­поль­зуй­те дан­ные из при­ла­га­е­мых фай­лов.

 

Ответ:

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

f = open('26.txt')

n = int(f.readline())

a=[]

for s in f:

start,end=map(int, s.split())

a.append([end, start])

a.sort()

count=[]

z=0

for i in range(n):

if z==0:

z=a[i][0]

count.append(a[i])

last=i

elif z<=a[i][1]:

z=a[i][0]

count.append(a[i])

last=i

del count[-1]

z=count[-1][0]

for i in range (last+1,n):

if z==0:

z=a[i][0]

count.append(a[i])

elif z<=a[i][1]:

count.append(a[i])

print(len(count), max(count, key = lambda d: d[0])[0])

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла в усло­вии по­лу­ча­ем ответ  — 16  1345.

 

Ответ: 16  1345.

 

При­ме­ча­ние. Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

При­ведём ре­ше­ние Ильи Кры­ло­ва на языке Python.

s = open('26.txt').readlines()[1:]

times = []

for item in s:

time = [int(i) for i in item.split()][::-1]

times.append(time)

times = sorted(times)

times = [i[::-1] for i in times]

selectedTimes = [times[1]]

times = times[1:]

for time in times:

if selectedTimes[-1][1] <= time[0]:

selectedTimes.append(time)

biggestStartTime = selectedTimes[-2][1]

biggestEndingTime = max([i[1] for i in times if biggestStartTime <= i[0]])

print(len(selectedTimes), biggestEndingTime)

Источники: