SPOJ ABCDEF中的TLE

时间:2016-08-30 07:40:56

标签: java algorithm binary-search brute-force

我正在尝试使用java解决ABCDEF,但我不断超时(TLE)。任何人都可以建议我如何提高效率。

问题如下:

您将获得一组介于-30000和30000(含)之间的整数S.

查找属于集合S的六元组总数(a,b,c,d,e,f),使其满足等式:

a * b + c =(f + e)d

输入

第一行包含整数N(1≤N≤100),即集合S的大小。

S的元素在接下来的N行中给出,每行一个整数。给定的数字将是截然不同的。

输出

输出合理的六元组总数。

我的解决方案是

public static void main(String args[]) throws Exception {
    //a*b + c = (f+e)d
    // -30000 and 30000 d!=0

    Reader in = new Reader();
    PrintWriter out = new PrintWriter(System.out, true);


    int n = in.nextInt();
    int[] arr = new int[n];
    List<Long> lhs = new ArrayList<Long>(n * n * n);
    List<Long> rhs = new ArrayList<Long>(n * n * n);


    for (int i = 0; i < n; i++) {
      arr[i] = in.nextInt();
    }


    //calc lhs
    for (int a = 0; a < n; a++) {
      for (int b = 0; b < n; b++) {
        for (int c = 0; c < n; c++) {
          long res = arr[a] * arr[b] + arr[c];
          lhs.add(res);

          if (arr[c] != 0) {
            res = (arr[a] + arr[b]) * arr[c];
            rhs.add(res);
          }
        }
      }

    }

    //cal RHS

    Collections.sort(rhs);
    Collections.sort(lhs);

    int lIndex = 0, rIndex = 0;
    int res = 0;

    while (lIndex < lhs.size() && rIndex < rhs.size()) {
      if (lhs.get(lIndex).equals(rhs.get(rIndex))) {
        int lSize = 0;
        Long lEl = lhs.get(lIndex);
        int rSize = 0;
        Long rEl = rhs.get(rIndex);
        do {
          ++lSize;
          ++lIndex;
        } while (lIndex < lhs.size() && lhs.get(lIndex).equals(lEl));

        do {
          ++rSize;
          ++rIndex;
        } while (rIndex < rhs.size() && rhs.get(rIndex).equals(rEl));

        res += lSize * rSize;
      } else if (lhs.get(lIndex) < rhs.get(rIndex)) {
        ++lIndex;
      } else {
        ++rIndex;
      }
    }
out.println(res);

  }




}

我上面所做的是计算方程的LHS和RHS的所有可能值,并计算RHS中每个LHS值的出现。

我还尝试只对RHS数组进行排序并在其中进行二进制搜索以查找结果,但仍然算法不是最佳的,无法通过所有测试用例。

0 个答案:

没有答案