我已提交此问题超过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;
}
答案 0 :(得分:1)
是的,我强烈认为这是对SPOJ的引用。我简单地记得自己解决这个问题。我真的不想通过在这里提供解决方案来破坏问题。只是因为你的问题不是代码的效率,而是算法。想想一个比你目前使用的算法更好的算法。
创建大向量S1和S2以及对其进行排序的解决方案仍然可以从复杂性中解决,这具有复杂性O(n_S1 log(n_S1) + n_S2 log(n_S2))
,其中n_S1
和n_S2
是元素的数量S1和S2。但是你在S1和S2中对所有对进行循环,其复杂度为O(n_S1 * n_S2)
,而且太多了。想想那里更聪明的东西。