SUMFOUR问题总是得到TLE

时间:2011-09-13 11:29:50

标签: c++ algorithm

我已提交此问题超过15次,我仍然得到TLE。怎么可能比这更快?

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int S1[16000001],c1;
int S2[16000001],c2;

inline bool comp(int a, int b) {return a > b;}

int main() {
    int arr[40010][5];
    int i,j;
    int n;
    scanf ("%d",&n);
    for (i=0;i<n;i++)
        for (j=0;j<4;j++)
            scanf ("%d",&arr[i][j]);
    for (i=0;i<n;i++)
        for (j=0;j<n;j++) {
            S1[c1++] = arr[i][0] + arr[j][1];
            S2[c2++] = arr[i][2] + arr[j][3];
        }
    sort(S1, S1 + c1);
    sort(S2, S2 + c2, comp);
    long long counter = 0 , sum;
    for (i=0;i<c1;i++)
        for (j=0;j<c2;j++) {
            sum = S1[i] + S2[j];
            if (sum == 0)
                counter++;
            else if (sum < 0)
                break;
        }
    printf ("%lld\n",counter);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

是的,我强烈认为这是对SPOJ的引用。我简单地记得自己解决这个问题。我真的不想通过在这里提供解决方案来破坏问题。只是因为你的问题不是代码的效率,而是算法。想想一个比你目前使用的算法更好的算法。

创建大向量S1和S2以及对其进行排序的解决方案仍然可以从复杂性中解决,这具有复杂性O(n_S1 log(n_S1) + n_S2 log(n_S2)),其中n_S1n_S2是元素的数量S1和S2。但是你在S1和S2中对所有对进行循环,其复杂度为O(n_S1 * n_S2),而且太多了。想想那里更聪明的东西。