这是一道尺取法的习题,我们先来看一下这道题的思路:
1.数组从小到大排序,遍历较小的I和j
2.找到大于等于a[i] + a[j] 的数组的下界
3.在j + 1 和 k - 1 之间的所有位置都满足条件
再来看一下代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn];
int main(){
int n;
cin>>n;
for(int i = 1; i <= n; i++){
cin>>a[i];
}
sort(a +1,a + 1 + n);
long long ans = 0;
for(int i = 1; i <= n; i++){
if(a[i] == 0){
continue;
}
for(int j = i +1; j <= n; j++) {
int pos = lower_bound(a+1, a+1+n,a[i]+a[j]) - a;
pos --;
ans += pos - j;
}
}
cout<<ans<<endl;
return 0;
}
各位楼主再见!