Я попытался решить этот вопрос интервью. Мой код работает для тестовых случаев, но не подходит для всех реальных тестовых случаев ввода. Я очень старался найти ошибку, но не смог этого сделать. Пожалуйста, найдите мой код ниже вопроса
Боб любит сортировать очень много. Он всегда думает о новых способах сортировки массива. Его друг Рам дает ему сложную задачу. Он дает Бобу массив и целое число К. Задача состоит в том, чтобы создать лексикографический минимальный массив после не более K-свопов. Только последовательные пары элементов могут быть заменены. Помогите Бобу вернуть минимальный возможный лексикографический массив после не более K-свопов.
Ввод: первая строка содержит целое число
T
то есть количество тестовых случаев.T
испытаний. Каждый тест имеет 2 строки. Первая строка содержитN(number of elements in array)
иK(number of swaps)
. Вторая строка содержитn
целых чисел массива.Результат: печать минимального массива лексикографических данных.
Ограничения:
1 <= T <= l0 1 <= N,K <= 1000 1 <= A[i] <= 1000000
Пример ввода (Plaintext Link)
2 3 2 5 3 1 5 3 8 9 11 2 1
Пример вывода (Plaintext Link)
1 5 3 2 8 9 11 1
объяснение
После обмена 1:
5 1 3
После обмена 2:
1 5 3
{1,5,3}
лексикографически минимальна, чем {5,1,3}
Пример 2:
Обмен 1:
8 9 2 11 1
Обмен 2:
8 2 9 11 1
Обмен 3:
2 8 9 11 1
#include <iostream>
using namespace std;
void trySwap(int a[], int start, int end, int *rem)
{
//cout << start << " " << end << " " << *rem << endl;
while (*rem != 0 && end > start)
{
if (a[end - 1] > a[end])
{
swap(a[end - 1], a[end]);
(*rem)--;
end--;
}
else end--;
}
}
void getMinimalLexicographicArray(int a[], int size, int k)
{
int start , rem = k, window = k;
for (start = 0; start < size; start++)
{
window = rem;
if (rem == 0)
return;
else
{
//cout << start << " " << rem << endl;
int end = start + window;
if (end >= size)
{
end = size - 1;
}
trySwap(a, start, end, &rem);
}
}
}
int main()
{
int T, N, K;
int a[1000];
int i, j;
cin >> T;
for (i = 0; i < T; i++)
{
cin >> N;
cin >> K;
for (j = 0; j < N; j++)
{
cin >> a[j];
}
getMinimalLexicographicArray(a, N, K);
for (j = 0; j < N; j++)
cout << a[j] << " ";
cout << endl;
}
return 0;
}
Вот два неудавшихся теста.
2
2 2
2 1
5 3
3 2 1 5 4
Во-первых, ваш код не делает свопов, потому что K> = N. Во втором случае ваш код своп 5 и 4, когда он должен провести третий обмен на 3 и 2.
EDIT: новая версия все еще слишком жадна. Правильный вывод для
1
10 10
5 4 3 2 1 10 9 8 7 6
является
1 2 3 4 5 10 9 8 7 6
,