没java,那我发一个,虽然不一定是最优解,用递归做的,一次向左移动一个[0,k]区间的最大值,offset偏移量,每次递归的时候递进1,k是剩余的操作次数,最后如果到数组尾元素,就退出递归。 import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for (int i = 0; i < t; i++) {
int k = scanner.nextInt();
int n = scanner.nextInt();
int[] arr = new int[n];
for (int j = 0; j < n; j++) {
arr[j] = scanner.nextInt();
}
function(0, k, arr);
print(arr);
}
}
private static void print(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
System.out.print(arr[i] + " ");
}
System.out.println(arr[arr.length - 1]);
}
public static void function(int offset, int k, int[] arr) {
if (offset == arr.length - 1) {
if (k % 2 != 0) {
int temp = arr[offset];
arr[offset] = arr[offset - 1];
arr[offset - 1] = temp;
}
return;
}
int max = arr[offset];
int index = offset;
for (int i = offset + 1; i <= offset + k && i < arr.length; i++) {
if (max < arr[i]) {
index = i;
max = arr[i];
}
}
for (int i = 0; i < index - offset; i++) {
int temp = arr[index - i];
arr[index - i] = arr[index - i - 1];
arr[index - i - 1] = temp;
k--;
}
if (k != 0) {
offset++;
function(offset, k, arr);
}
}
}