Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/163: Рейтинг темы: голосов - 163, средняя оценка - 4.96
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 40

Красота превыше всего

04.07.2020, 23:26. Показов 33586. Ответов 9

Студворк — интернет-сервис помощи студентам
Красота превыше всего.
В парке города Питсбурга есть чудесная аллея, состоящая из N посаженных в один ряд деревьев, каждое одного из K сортов. В связи с тем, что Питсбург принимает открытый чемпионат Байтландии по программированию, было решено построить огромную арену для проведения соревнований. Так, согласно этому плану вся аллея подлежала вырубке. Однако министерство деревьев и кустов воспротивилось этому решению, и потребовало оставить некоторые из деревьев в покое. Согласно новому плану строительства все деревья, которые не будут вырублены, должны образовывать один непрерывный отрезок, являющийся подотрезком исходного. Каждого из K видов деревьев требуется сохранить хотя бы по одному экземпляру. На вас возложена задача найти отрезок наименьшей длины, удовлетворяющий указанным ограничениям.

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

В первой строке находятся два числа N и K (1 ≤N,K≤ 250000). Во второй строке следуют N чисел (разделенных пробелами), i-е число второй строки задает цвет i-го слева дерева в аллее. Гарантируется, что присутствует хотя бы одно дерево каждого цвета.

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

Выведите два числа, координаты левого и правого концов отрезка минимальной длины, удовлетворяющего условию. Если оптимальных ответов несколько, выведите самый левый из отрезков.

Примеры

Ввод
5 3
1 2 1 3 2
Вывод
2 4
Ввод
6 4
2 4 2 3 3 1
Вывод
2 6
Помогите, пожалуйста, написать код, уважаемые программисты.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2020, 23:26
Ответы с готовыми решениями:

Красота превыше всего
В парке города Питсбурга есть чудесная аллея, состоящая из N посаженных в один ряд деревьев, каждое одного из K сортов. В связи с тем, что...

Информационная безопасность превыше всего
Всем привет.Недавно установил интернет дома и хотел бы задать очень важные вопросы достаточно ли того что я в брандмауэре активировал...

Ум vs Красота
Ну вот...пришло то время "Х", когда придется положив руку на сердце все таки выбрать, что важнее в девушке....ум или все таки красота.......

9
25 / 14 / 2
Регистрация: 28.06.2020
Сообщений: 50
05.07.2020, 14:45
Вия, тоже не могу решить эту задачу. Но нашла такое решение на С++, вдруг вы в нём разбираетесь и сможете переписать (я вот не могу, поделитесь кодом если что) Задача на "два указателя"
1
30 / 29 / 2
Регистрация: 27.06.2020
Сообщений: 14
13.07.2020, 11:39
На информатиксе набирает 30 баллов. Пинайте если получиться отладить и ускорить
https://informatics.mccme.ru/m... ol24298526
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
n, k = list(map(int, input().split()))
a = list(map(int, input().split()))
 
ibest = 0
jbest = n - 1
i = 0
j = 1
go = True 
b = [i for i in range(1,k + 1)]
s = []
 
while go:      
    if a[j] not in s:
        s.append(a[j])
        s.sort()
        
    if a[j] == a[i]:
        if i == n - 2:
            go = False     
        else:
            i += 1
               
    if s == b and j - i < jbest - ibest:
        ibest, jbest = i, j
    
    if j == n - 1:
        go = False
    else:
        j += 1
        
print(ibest + 1, jbest + 1)
1
20 / 18 / 4
Регистрация: 04.03.2020
Сообщений: 20
13.07.2020, 16:04
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#Задача №112560. Красота превыше всего
_ = input()
s = input()
A = list(map(int, s.split()))
n = len(A)
D = dict.fromkeys(A, 0)
k = len(D)
cnt = 0# если cnt==k, то полный комплект
i,j = 0, 0
mn = n
mn_ij = (1,n)
#print(s)
while j<len(A):
    if cnt<k:
        if D[A[j]]==0:
            cnt += 1
        D[A[j]] += 1
        j += 1
    else:# cnt==k
        D[A[i]] -= 1
        if D[A[i]]==0:
            cnt -= 1
            if j-i < mn:
                mn = j-i
                mn_ij = (i+1,j)
        i += 1
 
while i < j and cnt==k:
    D[A[i]] -= 1
    if D[A[i]]==0:
        if j-i < mn:
            mn = j-i
            mn_ij = (i+1,j)
        break
 
    i += 1
 
print(*mn_ij)
4
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
14.07.2020, 10:40
Еще один вариант
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
n, k = list(map(int, input().split()))
a = list(map(int, input().split()))
"""
Эх, был бы у нас список idx, который для каждого дерева содержал
индекс первого же встреченного дерева того же цвета, расположенного
правее! Ну или недопустимый индекс n, если такого дерева мы не встретили.
Давайте построим такой список.
Одновременно строим список frst индексов тех деревьев, цвет которых
встречается в ряду первый раз. Он понадобится нам для построения первого
допустимого отрезка.
"""
s = [(a[i],i) for i in range(n)]
s.sort()
idx = [0]*n
frst = [n]*k
frst[s[0][0]-1] = s[0][1]
for i in range(n-1):
    if s[i+1][0] == s[i][0]:
        idx[s[i][1]] = s[i+1][1]
    else:
        idx[s[i][1]] = n
        frst[s[i+1][0]-1] = s[i+1][1]
idx[s[n-1][1]] = n
"""
Берем начальный отрезок, содержащий все цвета, и его длину.
И начинаем от него просмотр массива направо в поисках минимальной длины
"""
i1 = 0
maxlen = max(frst)+1
i2 = maxlen
while idx[i1] < i2: i1 += 1
mi1 = i1
mi2 = i2
maxlen = i2-i1
 # Теперь ищем
while idx[i1] != n:
    i2 = idx[i1]+1
    while idx[i1] < i2: i1 += 1
    if i2-i1 < maxlen:
        mi1 = i1
        mi2 = i2
        maxlen = i2-i1
# Ответ
print(mi1+1, mi2)
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
15.07.2020, 09:32
Python
1
2
3
4
5
6
7
8
9
10
def task(n: int, k: int, trees: list) -> (int, int):
    for length in range(k, n + 1):
        for position in range(n - length + 1):
            if len(set(trees[position: position + length])) == k:
                return position + 1, position + length
 
 
assert task(5, 3, [1, 2, 1, 3, 2]) == (2, 4)
assert task(6, 4, [2, 4, 2, 3, 3, 1]) == (2, 6)
assert task(10, 9, [1, 2, 3, 4, 5, 6, 7, 8, 1, 9]) == (2, 10)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
15.07.2020, 12:47
зачем сортировка? зачем полный перебор?
обычный подсчет:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from collections import Counter
n, k = map(int, input().split())
*a, = map(int, input().split())
 
c = Counter(a)
 
l = 0
r = n-1
while c[a[l]] != 1:
    c[a[l]] -= 1
    l += 1
while c[a[r]] != 1:
    c[a[r]] -= 1
    r -= 1
 
print(l+1, r+1)
Code
1
2
3
6 4
2 4 2 3 3 1
[0, 1, 2, 2, 1]
дальше двигаемся по массиву a слева направо уменьшая c[a[i]] пока c[a[i]] не равно 1. найдем левую границу.
потом аналогично справа налево найдем правую границу.
ну и для минимума видимо нужно сначала найти правую границу потом левую и сравнить в конце.
сложность O(n).
0
3 / 3 / 0
Регистрация: 15.06.2020
Сообщений: 44
06.08.2021, 22:01
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
n, k = map(int, input().split())
a = list(map(int, input().split()))
if k == 1:
    print(1, 1)
    quit()
ibest = 0
jbest = 1
count = [0] * k
count[a[ibest] - 1] += 1
sht = 0
while sht != (k - 1):
    if count[a[jbest] - 1] == 0:
        sht += 1
    count[a[jbest] - 1] += 1
    jbest += 1
jbest -= 1
min_len = jbest - ibest + 1
i = ibest
j = jbest
while j < n and i < n:
    if count[a[i] - 1] >= 2:
        i += 1
        count[a[i - 1] - 1] -= 1
        if j - i + 1 < min_len:
            min_len = j - i + 1
            jbest = j
            ibest = i
    else:
        j += 1
        if j >= n:
            break
        count[a[j] - 1] += 1
 
print(ibest + 1, jbest + 1)
0
0 / 0 / 0
Регистрация: 10.01.2026
Сообщений: 1
10.01.2026, 20:07
pon
0
2903 / 1937 / 210
Регистрация: 05.06.2011
Сообщений: 5,714
11.01.2026, 22:43
Всем, кто отрезает с одного конца, потом с другого, вот контрпример: 1 2 2 3 1 2 2 3. Если отрезать слева, потом справа, получим финальную четвёрку; если справа, потом слева — начальную. Верный ответ — 2 3 1 либо 3 1 2.
Такой вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
n, k = map(int, input().split())
a = list(map(int, input().split()))
if k == 1:
    print(1, 1)
    quit()
ibest = 0
jbest = 1
itail = 0
count = [0] * k
count[a[ibest] - 1] = 1
for jtail in range(1,n):
    if a[jtail] == a[itail]:
        itail += 1
        while itail < jtail and a[itail] == a[itail+1]:
            itail += 1
    if jbest-ibest > jtail-itail or count[a[jtail]-1] == 0:
        ibest, jbest = itail, jtail
    count[a[jtail]-1] = 1
 
print(ibest + 1, jbest + 1)
Однократный проход по списку.
best — самый короткий отрезок, содержащий все цвета на рассмотренном отрезке последовательности;
tail — самый короткий отрезок, содержащий все цвета на рассмотренном отрезке последовательности из оканчивающийся на конце рассмотренного отрезка.
Очередной цвет добавляем в конец tail (например, tail 1 2 2 3 -> 1 2 2 3 1)
Если он совпадает с началом, отрезаем начало (1 2 2 3 1 -> 2 2 3 1)
Если теперь tail начинается с нескольких одинаковых цветов, отрезаем лишние повторения (2 2 3 1 -> 2 3 1)
Если полученный tail короче best либо добавленный цвет ранее не встречался, best = tail
Запоминаем, что последний цвет уже встречался в последовательности (count[a[jtail]-1] = 1)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2026, 22:43
Помогаю со студенческими работами здесь

Красота на форме
Народ поделитесь опытом как вы красиво оформляете формы и расположение компонентов на них?) Неоднократно видел в чужих примерах программ...

Красота запуска
Хочу доделать скрипт: #!/system/bin/sh clear;sleep 1;clear;echo '▒▒▒▒▒▒▒▒▒▒ 10% please wait...';sleep 1;clear;echo...

Красота и стиль ПО
Современный стиль программирования: Жуткий, безобразный, бесвкусный стиль. Все формы объектов сведены в единую прямоугольную сущьность,...

Красота материалов
Материалы отображаются как то не корректно. Например вместо красивого неонового сияния, я получаю то, что на картинке. Ни неон ни...

Красота дальних стран
И все-таки здесь было красиво. Непривычно и страшно, как на другой планете (фиолетовое небо на закате… Елки эти волосатые, вершины скал –...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru