Pagini recente » Cod sursa (job #2340940) | Diferente pentru home intre reviziile 754 si 755 | Monitorul de evaluare | Cod sursa (job #1469747) | Cod sursa (job #96514)
Cod sursa(job #96514)
#include<stdio.h>
#include<stdlib.h>
int v[801],n,i,j,s=0,k;
/*int cauta(int n,int k,int b){
int p,u,m;
p=b+1;u=n-1;
if (p==u){
if (v[p]>=k)
return n-1;
else return n;
}
while (p<=u){
m=(p+u)/2;
if (k==v[m])
return m;
if(v[m]<k)
p=m;
else
u=m+1;
}
//if(v[u]>n)
//return p-1;
//printf("%d ",u);
return u;//p
}
*/
int cautare(int p, int u)
{
int m;
m=(p+u)/2;
while (p<=u){
if ((v[m]<=v[i]+v[j] && v[m+1]>v[i]+v[j]) || (v[m]<=v[i]+v[j] && m==n-1))
return m;
else if (v[m]<=v[i]+v[j] && v[m+1]<=v[i]+v[j]) {
p=m+1;
m=(p+u)/2;
}
else {
u=m-1;
m=(p+u)/2;
}
}
return 0;
}
int compara (const void * a, const void * b){
return ( *(int*)a - *(int*)b );
}
int main(){
freopen("nrtri.in","r",stdin);
freopen("nrtri.out","w",stdout);
scanf("%d",&n);
for (i=0;i<n;++i)
scanf("%d",&v[i]);
qsort (v, n, sizeof(int), compara);
for (i=0; i<n-2; ++i)
for (j=i+1; j<n-1; ++j){
k=cautare(j,n-1);
if (k) s+=(k-j);
}
printf("%d\n",s);
return 0;
}