竞争性编程中的Java性能非常慢

时间:2017-08-14 17:35:29

标签: algorithm

我花了大约一个小时试图优化这段代码,但它似乎仍然是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?有更好的解决方案吗?

任何帮助都受到高度重视。

1 个答案:

答案 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.假设您可以随时取下任何筹码。