Форум программистов, компьютерный форум, киберфорум С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 11.12.2021
Сообщений: 18
1

Нахождение самого длинного подмассива одинаковых чисел с возможностью удаления до k чисел

29.08.2023, 17:43. Показов 1576. Ответов 9

Author24 — интернет-сервис помощи студентам
Нужно найти самый длинный подмассив массива состоящий из одинаковых чисел, притом можно удалить до k чисел.

Формат входных данных
В первой строке входа заданы два целых числа n и k (1 ≤ n ≤ 1 000 000, 1 ≤ k ≤ 1 000 000) — длина массива и количествоо чисел которые можно удалить. В следующей строке заданы n целых чисел c_i (1 ≤ c_i ≤ n) — элементы массива

Формат результата
Выведите одно число — максимальную длину последовательности, которую можно получить, удаляя числа

Примеры
Входные данные
8 2
2 4 4 2 1 4 2 4
Результат работы
3
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2023, 17:43
Ответы с готовыми решениями:

Замена самого короткого и самого длинного чисел местами
Дана строка символов. Числа в строке отделяются одним пробелом. Поменять местами самое длинное и...

определить в массиве длину самого длинного ряда повторяющихся чисел
Помогите пожалуйста решить данную задачу. Заранее огромное спасибо

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

Нахождение самого длинного слова
Всем привет, надо найти самое длинное слово в предложении: что-то программа типа: a=max(a.split(),...

Нахождение самого длинного слова
Появилась проблема, пишет несколько ошибок. В sl должен попадать текст, до этого попадал, сейчас не...

9
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
29.08.2023, 21:00 2
Ten20, Если я правильно понял, надо просто найти количество уникальных чисел?

Добавлено через 3 минуты
Нет. Там еще условие
Цитата Сообщение от Ten20 Посмотреть сообщение
количество чисел которые можно удалить
Но все равно получается простая формула
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
29.08.2023, 21:16 3
Цитата Сообщение от Байт Посмотреть сообщение
Но все равно получается простая формула
Извини, какая формула при задаче на перебор/подсчет ?
Нужно считать одинаковые числа и количество чисел между ними.
Потом выбрать наибольшую по допустимым k.

Добавлено через 5 минут
Если я не ошибаюсь, это довольно распространенная задача тут.
ТС мог бы воспользоваться поиском.
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
29.08.2023, 21:39 4
Цитата Сообщение от SmallEvil Посмотреть сообщение
Извини, какая формула при задаче на перебор/подсчет ?
Нужно считать одинаковые числа и количество чисел между ними.
Да, количество уникальных надо подсчитать. Для этого можно воспользоваться чем-то вроде map. Но дальше - простая формула
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
29.08.2023, 22:12 5
Цитата Сообщение от Байт Посмотреть сообщение
Да, количество уникальных надо подсчитать. Для этого можно воспользоваться чем-то вроде map. Но дальше - простая формула
Поделишься ? )

Добавлено через 2 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Да, количество уникальных надо подсчитать.
Хотя если брутфорсить, то не нужно.
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
29.08.2023, 22:48 6
Цитата Сообщение от SmallEvil Посмотреть сообщение
Поделишься ? )
U - количество уникальных
x = n-U > k ? n - k : n - U;
Как-то так, если не запутался в тернарке.
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
29.08.2023, 23:05 7
n = 10 k = [0,1,2,3]
1 2 4 4 2 1 4 1 4 4
Байт, Попробуем ?
const U = 3
k = 0
x = 10-3 > 0 ? 10 - 0 : 10 - 3;

Можно я дальше не буде ?

Добавлено через 2 минуты
Самым брутальным брутфорсом. Конечно при таких входных, я думаю он загнется.
Но всё же. Для завтра есть идейка )
C++Выделить код
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
#include <iostream>
#include <vector>
 
using namespace std;
 
int main(){
 
    // n - длина последовательности
    // л - допустимое количество удаляемых чисел
    int N, K;
    cin >> N >> K;
    // max_chain - собственно результат
    // chain - текущая
    int max_chain = 1, chain = 0;
    vector<int> seq(N); // наша последовательность
    
    for(int i = 0; i!=N; ++i)
        cin >> seq[i];
    int p = 0, pos = 0;
    int k = K;
    while(p < N){
        if (seq[p] == seq[pos++])
            chain++;
        else
            --k;
        if (k == 0 || pos == N){
            k = K;
            while(pos!=N && seq[p] == seq[pos++])
                chain++;
            if (chain > max_chain) 
                max_chain = chain;
            int n = seq[++p];
            while(p!=N && seq[p++]!=n)
                ;
            pos = p;
            chain = 0;
        }
    }
    cout << max_chain;
}
Добавлено через 3 минуты
Байт, тут формулой не получится, потому что расположение чисел играет огромную роль.
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
29.08.2023, 23:27 8
Цитата Сообщение от SmallEvil Посмотреть сообщение
расположение чисел играет огромную роль.
Значит, я не правильно понял условие. Оно мутненькое какое-то...
0
1 / 1 / 0
Регистрация: 12.02.2016
Сообщений: 15
30.08.2023, 02:14 9
Для каждого уникального числа (цвета) в массиве массив можно представить как череду интервалов (полос) этого цвета (одноцветных) и полос из элементов других цветов (разноцветных). В итоге нужно определиться, с какой одноцветной полосы будет эффективнее всего начинать подмассив, учитывая то, что мы будем идти справа налево и удалять разноцветные полосы, сколько для этого хватит K, для того, чтобы склеились одноцветные и длина подмассива (склеенной полосы) была максимальной. И максимум (по цветам) максимальной длины склеенной полосы и будет ответом.
Т.к. 1 ≤ n ≤ 1 000 000 и 1 ≤ c_i ≤ n, то допустимо использовать О(n) памяти и допустимо иметь массив, в котором можно будет обращаться к данным по индексами цветов. Ну и идём по исходному массиву, как только встретим новый цвет, выдвигаем его начало в кандидаты на начало склеенной полосы. Когда c_i == c_i-1 обновляем конец текущей склеенной полосы этого цвета, когда c_i != c_i-1 смотрим, хватает у нас остатков K или нет, чтобы приклеить начало новой полосы цвета c_i. Если нет, то кандидатура начала склеенной полосы переходит на следующую полосу, обновляется текущий максимум длины склеенной полосы, отменяем удаление разноцветной полосы, которая идёт перед новой кандидатурой и пр.
0
2859 / 2006 / 988
Регистрация: 21.12.2010
Сообщений: 3,711
Записей в блоге: 10
30.08.2023, 02:25 10
ощущение что двумерная динамика
0
30.08.2023, 02:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2023, 02:25
Помогаю со студенческими работами здесь

Нахождение самого длинного слова в строке
Всем привет! При решении задачи возникает ошибка во время её работы. Не знаю в чём проблема....

LISP, нахождение самого длинного слова
Доброго времени суток! Такой вопрос: нужно запрограммировать функцию, которая принимает на вход...

Нахождение самого длинного палиндрома в строке
Прошу помощи! Подскажите как вообще реализовать данный код? А то вторую ночь сижу - ничего в голову...

Нахождение самого длинного слова в строке
Здравствуйте :) У меня есть проблема, я написал программу, но она работает не совсем так как надо....

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru