Pagini recente » Cod sursa (job #1719409) | Cod sursa (job #1019843) | Cod sursa (job #2703374) | Cod sursa (job #1730921) | Cod sursa (job #271345)
Cod sursa(job #271345)
#include<stdio.h>
#include<stdlib.h>
#define N 802
struct milk{int a;} v[N];
int n,ap[30001];
int compar(const void*p, const void*q)
{
milk pp=*(milk*)p,qq=*(milk*)q;
if (pp.a>qq.a) return 1;
if (pp.a<qq.a) return -1;
return 0;
}
int caut2(int p,int x,int u)
{
int m;
while(p!=u)//cat timp intervalul in care caut are mai mult de un element
{
m=(p+u)/2;
if(x<=v[m].a)
u=m;
else
p=m+1;
}
if(v[p].a<x)
return p-1;
return p;
}
int caut1(int p,int x,int u)
{
int m;
while(p!=u)//cat timp intervalul in care caut are mai mult de un element
{
m=(p+u)/2;
if(x<=v[m].a)
u=m;
else
p=m+1;
}
if(v[p].a>x)
return p-1;
return p;
}
int sum;
void tri(int x, int y,int n, int pozi)
{
int p=ap[v[x].a]*ap[v[y].a],s=0;
for (int i=pozi; i<=n; ++i) s=s+ap[v[i].a];
sum+=p*s;
}
void suma(int n)
{
int s;
for (int i=1; i<n; ++i)
{
for (int j=i+1; j<=n; ++j)
{
s=v[i].a+v[j].a;
if (s<=v[n].a)
{
int pozi=caut1(j+1,s,n);
int pozf=caut2(j+1,s,n);
if (v[pozf].a>s)
--pozf;
if (pozi==j) ++pozi;
tri(i,j,pozf,pozi);
}
else
break;
}
}
printf("%d",sum);
}
void citire()
{
freopen("nrtri.in","r",stdin);
freopen("nrtri.out","w",stdout);
scanf("%d",&n);
int num=1;
for (int i=1; i<=n; ++i)
{
scanf("%d",&v[num].a);
++ap[v[num].a];
if (ap[v[num].a]==1)
++num;
}
if (ap[v[num].a]>1||v[num].a==0) --num;
qsort(v+1,num,sizeof(v[0]),compar);
for (int i=1; i<=num;++i) printf("%d ",v[i].a);
suma(num);
}
int main()
{
citire();
return 0;
}