如何在排序数组时提高运行时间

时间:2015-11-25 04:04:38

标签: java arrays compare

我已经成功为USACO创建了“混合牛奶”的工作解决方案,但法官说我的程序耗时太长。

我认为这与我在第29-44行询问价格对农民名单进行排序的方式有关。我有什么方法可以改善运行时间吗?

/*
 ID:
 LANG: JAVA
 TASK: milk
 */
import java.util.*;
import java.io.*;

public class milk {

    public static void main(String[] args) throws IOException {
        double startTime = System.currentTimeMillis();
        BufferedReader s = new BufferedReader(new InputStreamReader(new FileInputStream(new File("test.in"))));
        PrintWriter w = new PrintWriter(new File("test.out"));
//        BufferedReader s = new BufferedReader(new InputStreamReader(new FileInputStream(new File("milk.in"))));
//        PrintWriter w = new PrintWriter(new File("milk.out"));
        String[] st = s.readLine().split(" ");
        int N = Integer.parseInt(st[0]);
        int M = Integer.parseInt(st[1]);
        int[] P = new int[M];
        int[] A = new int[M];
        String[] sets = new String[M];
        for (int i = 0; i < M; i++) {
            sets[i] = s.readLine();
            st = sets[i].split(" ");
            P[i] = Integer.parseInt(st[0]);
        }
        int maxp = ("" + maxVal(P)).length();
        for (int i = 0; i < M; i++) {
            st = sets[i].split(" ");
            while (st[0].length() < maxp) {
                st[0] = "0" + st[0];
            }
            sets[i] = st[0] + " " + st[1];
        }
        Arrays.sort(sets);
        int cap = 0;
        for (int i = 0; i < M && cap <= N; i++) {
            st = sets[i].split(" ");
            P[i] = Integer.parseInt(st[0]);
            A[i] = Integer.parseInt(st[1]);
            cap += A[i];
        }
        int sum = 0;
        int units = 0;
        int a;
        for (int i = 0; units < N; i++) {
            if (A[i] <= N - units) {
                sum = sum + P[i] * A[i];
                units += A[i];
            } else {
                a = N - units;
                if (a > A[i]) {
                    a = A[i];
                }
                sum = sum + P[i] * a;
                units += a;
            }
        }
        System.out.println(units);
        System.out.println(sum);
        w.println(sum);
        w.close();
        double endTime = System.currentTimeMillis();
        System.out.println("Took " + ((endTime - startTime) / 1000) + " seconds.");
    }

    public static int maxVal(int[] x) {
        int max = 0;
        for (int i : x) {
            if (i > max) {
                max = i;
            }
        }
        return max;
    }
}

编辑:谢谢Andreas!

更改了代码并设定了时间限制:

/*
 ID:
 LANG: JAVA
 TASK: milk
 */

import java.util.*;
import java.io.*;

public class milk {

    public static void main(String[] args) throws IOException {
        double startTime = System.currentTimeMillis();
//        BufferedReader s = new BufferedReader(new InputStreamReader(new FileInputStream(new File("test.in"))));
//        PrintWriter w = new PrintWriter(new File("test.out"));
        BufferedReader s = new BufferedReader(new InputStreamReader(new FileInputStream(new File("milk.in"))));
        PrintWriter w = new PrintWriter(new File("milk.out"));
        String temp = s.readLine();
        int spc = temp.indexOf(" ");
        int N = Integer.parseInt(temp.substring(0, spc));
        int M = Integer.parseInt(temp.substring(spc + 1));
        System.out.println(N + " " + M);
        int[] P = new int[M];
        int[] A = new int[M];
        Farmer[] f = new Farmer[M];
        for (int i = 0; i < M; i++) {
            temp = s.readLine();
            spc = temp.indexOf(" ");
            f[i] = new Farmer(Integer.parseInt(temp.substring(0, spc)), Integer.parseInt(temp.substring(spc + 1)));
        }
        Arrays.sort(f);
        for (int i = 0; i < M; i++) {
            P[i] = f[i].getPrice();
            A[i] = f[i].getInventory();
        }
        int sum = 0;
        int units = 0;
        int a;
        for (int i = 0; units < N; i++) {
            if (A[i] <= N - units) {
                sum = sum + P[i] * A[i];
                units += A[i];
            } else {
                a = N - units;
                if (a > A[i]) {
                    a = A[i];
                }
                sum = sum + P[i] * a;
                units += a;
            }
        }
        System.out.println(units);
        System.out.println(sum);
        w.println(sum);
        w.close();
        double endTime = System.currentTimeMillis();
        System.out.println("Took " + ((endTime - startTime) / 1000) + " seconds.");
    }
}

class Farmer implements Comparable<Farmer> {

    private int price;
    private int inventory;

    public Farmer(int price, int inventory) {
        this.price = price;
        this.inventory = inventory;
    }

    public int getPrice() {
        return price;
    }

    public int getInventory() {
        return inventory;
    }

    @Override
    public int compareTo(Farmer f1) {
        if (f1.price != this.price) {
            return this.price - f1.price;
        } else if (f1.inventory != this.inventory) {
            return f1.inventory - this.inventory;
        } else {
            return 0;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

Java是一种面向对象的语言。使用它。

您的代码会继续处理字符串行,拆分和连接。那很慢。

将行读入包含两个整数值的对象。使类实现Comparable,按两个值排序,以便您可以调用sort()

处理速度更快,因为您只解析一次数字。排序速度更快,因为您不必对数字进行零填充,而是按整数排序,而不是字符串。

由于您的行由两个由单个空格分隔的整数组成,因此请勿使用split()。使用indexOf(' ')并致电substring()两次。它更快,内存更少。