代码:
此题不超时要用二分法哦
方法一:暴力枚举
#include<bits/stdc++.h>
using namespace std;
long long n,a[9999999],s;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)
{
if(a[i]+a[j]>a[k]&&a[j]+a[k]>a[i]&&a[i]+a[k]>a[j])
{
s++;
}
}
}
}
printf("%lld",s);
return 0;
}
方法二:二分法
#include<bits/stdc++.h>
using namespace std;
long long n,k,s[100009],l,c,r,sum;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&s[i]);
sort(s+1,s+1+n);
for(int i=1;i<=n-2;i++)
{
for(int j=i+1;j<=n-1;j++)
{
l=j;
r=n+1;
c=0;
for(;;)
{
c=(l+r)/2;
if(s[c]>=s[i]+s[j])r=c;
else if(s[c]<s[i]+s[j])l=c;
if(l+1==r)
{
break;
}
}
sum=sum+l-j;
//cout<<l<<" "<<j<<" ";//-i<<" ";
}
}
cout<<sum;
return 0;
}