題目鏈接:https://atcoder.jp/contests/abc143/tasks/abc143_d
思路:排序,枚舉前兩個數,二分第三個數的位置即可.
代碼:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3 + 5;
int a[maxn];
int main() {
int n;
ios::sync_with_stdio(0);
cin >> n;
for(int i = 0 ; i < n ; i++) {
cin >> a[i];
}
sort(a , a + n);
long long ans = 0;
for(int i = 0 ; i < n -2; i++) {
for(int j = i + 1 ; j < n - 1; j++) {
int t = a[i] + a[j];
int left = j + 1, right = n - 1;
if(a[j + 1] >= t) { //如果最小的a[j+1]都不滿足a[j+1],就沒必要搜索了
continue;
}
while(left < right) {
int mid = (left + right + 1) / 2;
if(a[mid] < t)left = mid;
else right = mid - 1;
}
if(left > j)
ans += left - j;
}
}
cout << ans << "\n";
return 0;
}