Pagini recente » Cod sursa (job #779346) | Cod sursa (job #1007057) | Cod sursa (job #2727627) | Cod sursa (job #2463051) | Cod sursa (job #69704)
Cod sursa(job #69704)
//varianta de 75 puncte
#include<fstream.h>
int n,i,j,v[801];
int outOfBorders,mijBun,stanga,dreapta;
int merge(int a,int b, int c)
{
if(a+b<c) return -1;//tre sa caut la stanga
if(a+c<b||c+b<a) return -2; // tre sa caut la dreapta
return 1;
}
int cauta(int directie,int stang)
{
int st,dr,mij;
st=j+1;
if(directie==1) st=stang;
dr=n;
while(st<=dr)
{
mij=(st+dr)/2;
outOfBorders=((mij+directie>n)||(mij+directie<1));
mijBun=merge(v[i],v[j],v[mij]);
if(mijBun==1)
{
if(outOfBorders)
return mij;
if(merge(v[i],v[j],v[mij+directie])!=1||mij+directie<=j)
return mij;
if(directie==1) st=mij+1;
else dr=mij-1;
}
//else if(outOfBorders) return -1;
else if(mijBun==-1) dr=mij-1;
else st=mij+1;//if(mijBun==-2)
}
return -1;
}
int main()
{
ofstream out("nrtri.out");
int cnt=0;
ifstream in("nrtri.in");
in>>n;
for(i=1;i<=n;i++)
in>>v[i];
in.close();
int aux;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
stanga=cauta(-1,0);
if(stanga!=-1) //sau dreapta ca tot aia e(adica nu a gasit nici un numar care sa mearga)
{
dreapta=cauta(1,stanga);
cnt+=dreapta-stanga+1;
}
}
out<<cnt<<'\n';
out.close();
return 0;
}