Эй, я пытаюсь выполнить кодовую задачу, и я закодировал следующий код.
Один тестовый пример проходит успешно, но все остальные получают ошибку времени выполнения NZEC error. Я застрял с этим в течение двух дней. Помогите пожалуйста мне.
Постановка проблемы:
Боб очень любит сортировать. Он всегда думает о новых способах сортировки массива. Его друг Рам дает ему сложную задачу. Он дает Бобу массив и целое число K. Задача состоит в том, чтобы создать лексикографический минимальный массив после не более чем K-перестановок. Только последовательные пары элементов могут быть заменены местами. Помогите Бобу вернуть лексикографический минимальный массив, возможный после не более чем K-перестановок.
Ввод:
Первая строка содержит целое число T (то есть количество тестов). Далее следуют Т-тестовые случаи. Каждый тест состоит из 2 строк. Первая строка содержит N (количество элементов в массиве) и K (количество перестановок). Вторая строка содержит n целых чисел массива.
Вывод:
Выведите лексикографический минимальный массив.
Образец ввода (ссылка в виде открытого текста)
2 3 2 5 3 1 5 3 8 9 11 2 1
Пример вывода (ссылка в виде открытого текста)
1 5 3 2 8 9 11 1
public static long Mostswaps;
public static void Main(string[] args)
{
var line1 = Console.ReadLine().Trim();
var N = long.Parse(line1);
var nk = new string[N];
var numbers = new string[N];
for (long i = 0; i < N; i++)
{
nk[i] = (Console.ReadLine().Trim());
numbers[i] = (Console.ReadLine().Trim());
}
for (long i = 0; i < N; i++)
{
long n;
long.TryParse(nk[i].Split(' ')[0], out n);
long.TryParse(nk[i].Split(' ')[1], out Mostswaps);
var numbersforcurrrent = numbers[i].Split(' ').Select(x => Convert.ToInt64(x)).ToArray();
var numbertotryswap = numbersforcurrrent.Where(x => x < numbersforcurrrent.First()).ToList();
numbertotryswap.Sort();
var minlex = new List<long[]>();
var j = 0;
foreach (var swapnumber in numbertotryswap)
{
minlex.Add(LexicalMin(numbersforcurrrent, Mostswaps, swapnumber));
j++;
}
var minimum = minlex.First().ConvertToLex();
minimum = minlex.Select(ne => ne.ConvertToLex()).Concat(new[] { minimum }).Min();
var minimumlex = minlex.First(x => x.ConvertToLex() == minimum);
foreach (var lex in minimumlex)
{
if (Array.IndexOf(minimumlex, lex) == minimumlex.Length)
{
Console.Write(lex);
}
else Console.Write(lex+" ");
}
Console.WriteLine();
}
}
public static long[] LexicalMin(long[] word, long swapsleft, long numbertotryswap)
{
if (swapsleft == 0)
{
return word;
}
var originalLex = word.ConvertToLex();
var checkword = word.ToArray();
var tempword = word.ToArray();
long currentindex = Array.IndexOf(checkword, numbertotryswap);
if (currentindex != 0)
{
var temp = checkword[currentindex - 1];
tempword[currentindex - 1] = checkword[currentindex];
tempword[currentindex] = temp;
}
swapsleft--;
if (tempword.ConvertToLex() < originalLex && swapsleft == 0)
{
return tempword;
}
tempword = LexicalMin(tempword, swapsleft, numbertotryswap);
return tempword;
}
public static class ListHelper
{
public static long ConvertToLex(this long[] source)
{
var result = source.Aggregate(string.Empty, (current, number) => current + number.ToString());
return Convert.ToInt64(result);
}
}