算法分析:
正常的暴力肯定过不了.
1.不是有四个数相加吗,我们可以看成是两个数加两个数,然后就可以将两个数的所有组合放到一个数组里面, 再排序。
2.再判断另外两个数的组合时,对上面的两个组合进行二分查找。这样就快了很多了。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int maxn = 4005;
int a[maxn], b[maxn], c[maxn], d[maxn];
int main(int argc, char const *argv[])
{
int n;
cin >> n;
std::vector<int> v;
for (int i = 1; i <= n; ++i)
{
cin >> a[i] >> b[i] >> c[i] >> d[i];
}
//合并前两列数据
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
v.push_back(a[i] + b[j]);
}
}
//二分查找
sort(v.begin(), v.end());
ll ans = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
ll x = -(c[i] + d[j]);
ans += upper_bound(v.begin(), v.end(), x) - lower_bound(v.begin(), v.end(), x);
}
}
cout << ans;
return 0;
}