codeforces427e:不可能用Java编写足够快的解决方案

codeforces427e:不可能用Java编写足够快的解决方案,java,Java,我确信这里有很多人对Codeforce问题感兴趣,所以这里的问题是: 问题:我坚持解决问题。在第21次测试中,我获得了超过时间限制的。我找到了,但它似乎比我的还要慢 经过一段时间的考虑,我决定用Java7编写一个更快的解决方案是不可能的 问题:可以用Java 7编写更快的解决方案吗 我的解决方案: public class PolicePatrol { public static void main(String[] args) { Scanner in = new S

我确信这里有很多人对Codeforce问题感兴趣,所以这里的问题是:

问题:我坚持解决问题。在第21次测试中,我获得了超过时间限制的
。我找到了,但它似乎比我的还要慢


经过一段时间的考虑,我决定用Java7编写一个更快的解决方案是不可能的

问题:可以用Java 7编写更快的解决方案吗

我的解决方案:

public class PolicePatrol {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        int criminalAmount = in.nextInt();
        int patrolCarCapacity = in.nextInt();
        int[] criminalLocations = new int[criminalAmount];
        for (int i = 0; i < criminalLocations.length; i++)
            criminalLocations[i] = in.nextInt();

        long distance = calcDistance(criminalLocations, patrolCarCapacity);
        out.print(distance);
        out.flush();
    }

    protected static long calcDistance(int[] criminals, int patrolCapacity) {
        // put patrol on the position of the middle criminal
        int patrolPosition = criminals[criminals.length / 2]; 

        double itr = (criminals.length - 1) / 2.0;
        // number of travels to the left from the police station
        int itrLeft = (int) Math.ceil(Math.ceil(itr) / ((double) patrolCapacity)); 
        //number of travels to the right from the police station
        int itrRight = (int) Math.ceil(Math.floor(itr) / ((double) patrolCapacity)); 

        long distance = 0;

        int lo = 0;
        while (itrLeft-- > 0) {
            distance += patrolPosition - criminals[lo];
            lo = lo + patrolCapacity;
        }

        int hi = criminals.length - 1;
        while (itrRight-- > 0) {
            distance += criminals[hi] - patrolPosition;
            hi -= patrolCapacity;
        }
        return 2 * distance;
    }
}
。我只是用一个更快的实现替换了它。代码取自:


对于输入中的1M整数,这将我的机器上输入解析所需的时间从~1.3s减少到~0.35s,这是4的一个因数。

“我认为用Java 7编写更快的解决方案是不可能的。”与“用Java 7编写更快的解决方案是否可能?”-让战斗开始吧!请不要要求人们必须接触外部网站才能回答您的问题。直接封装任何必要的规范。@OliCharlesworth请查看我问题的更新部分。您的算法的时间复杂度是多少?@Adi我在帮助中心找不到任何针对优化问题的内容,是否可以提供参考?请注意,它可能在这两个站点的主题上
Input:
arraySize
step
array

Output:
Number that represents summary of all Math.abs(array[array.length / 2] - array[i]) for all `i % step == 0`
static class FastScanner {
    BufferedReader br;
    StringTokenizer st;

    FastScanner(InputStream f) {
        br = new BufferedReader(new InputStreamReader(f));
    }

    String next() throws IOException {
        while (st == null || !st.hasMoreTokens()) {
            st = new StringTokenizer(br.readLine());
        }
        return st.nextToken();
    }

    int nextInt() throws IOException {
        return Integer.parseInt(next());
    }
}