我花了大约一个小时试图优化这段代码,但它似乎仍然是TLE。
public static void main(String[] args) {
int testCase = sc.nextInt();
for(int testCaseCount = 0; testCaseCount < testCase; ++testCaseCount) {
int M = sc.nextInt();
int R = sc.nextInt();
int[] arr = new int[M];
for (int i = 0; i < M; i++) {
arr[i] = i;
}
for (int i = 0; i < R; i++) {
int x = sc.nextInt() - 1;
int index = arr[x];
out.print(index + " ");
shift(arr, x, index);
}
out.println();
}
out.close();
}
public static void shift(int[] arr, int x, int pos) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] < pos) ++arr[i];
}
arr[x] = 0;
}
这是我试图解决https://open.kattis.com/problems/moviecollection的原始问题。我一开始尝试使用Stack但是我很快就发现它太慢了。在这个版本中,我创建了一个数组,跟踪第i个电影盒所在的索引。更新位置时,它会通过将数组中的值指定为0来移动要移动的框,并且将值小于移动到0的框的原始值的值递增1。这是我能想到的最快的解决方案,但是一种感觉告诉我二进制搜索可以以某种方式参与。
是我还是Java?有更好的解决方案吗?
任何帮助都受到高度重视。
答案 0 :(得分:0)
这可以通过使用数学来解决。示例
Input
3 3
3 1 1
output
2 1 0
您需要跟踪当前位置。然后你需要跟踪中间视频(当电流为3时,这个handels得1,应该返回1)。
current = 1;
left = numOfVideos;
mid = 0;
for video in selected
if video > current:
video - current - mid;
else if video < current:
(current - mid) - video;
else:
0;
current = video;
if current == left || current == 0:
mid = 0
else:
mid = 1;
如果中间部分不起作用,请保持在中间位置1.假设您可以随时取下任何筹码。