Cod sursa(job #766157)

Utilizator bratualexBratu Alexandru bratualex Data 10 iulie 2012 14:41:15
Problema Numarare triunghiuri Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>

using namespace std;
ifstream fin ("nrtri.in");
ofstream fout ("nrtri.out");
//int verif ( int [],int,int,int);
int binara(int,int,int);
void sortare(int,int);
void merge(int,int,int,int);
int v[800],aux[800];
int main()
{
    int n,j,i,nr=0,poz,k;
    fin>>n;
    for(i=0;i<n;i++)
        fin>>v[i];

    sortare(0,n-1);
    //for(i=0;i<n;i++)
        //fout<<v[i]<<" ";

    for(i=0;i<n-2;i++)
        for(j=i+1;j<n-1;j++)
            /*for(k=j+1;k<n;k++)
                if ( ( v[i]+v[j]>=v[k]  )&& (v[i]+v[k]>=v[j]  )&&( v[j]+v[k]>=v[i]   ) )
                    nr++;
            trebe comentat ( inchis comentariu)*/
        {
            k=v[i]+v[j];
            poz=binara(j+1,n-1,k);
            //if(poz==j+1)
            //{
            //k=v[i]+v[j];


                if ( k>=v[poz] )
                {
                    //nr++;
                    while (poz>j)
                    {
                        nr++;
                        poz--;
                    }
                }
                else
                    if (k>=v[--poz]&&poz>j)
                    {
                        nr++;
                        poz--;
                        while (poz>j)
                        {
                            nr++;
                            poz--;
                        }
                    }



            //}
        }
    fout<<nr;
    fin.close();
    fout.close();
    return 0;
}
/*
int verif( int v[800],int i, int j ,int k)
{
    if(  ( v[i]+v[j]>=v[k]  )&& (v[i]+v[k]>=v[j]  )&&( v[j]+v[k]>=v[i]   )  )
        return 1;
    return 0;
}
*/


int binara (int a,int b,int x)
{
    int mid;
    mid=a+(b-a)/2;
    if (a!=b)
        if ( v[mid] >= x )
        {
            return binara (a,mid,x );
        }
        else
        {
            return binara (mid+1,b,x);
        }
    else
        return a;
}

void sortare (int a,int b)
{
    int mijl;
    mijl=a+(b-a)/2;
    if(a<b)
    {
        sortare(a,mijl);
        sortare(mijl+1,b);
        merge(a,mijl,mijl+1,b);
    }
}
void merge (int a,int na,int b,int nb)
{
    int i=0,j,k,l;
    k=nb;
    l=a;
    while (a<=na&&b<=nb)
    {
        if (v[a]<=v[b])
            aux[i++]=v[a++];
        else
            aux[i++]=v[b++];
    }
    while (a<=na)
    {
        aux[i++]=v[a++];

    }
    while (b<=nb)
    {
        aux[i++]=v[b++];
    }
    j=i;
    for(i=k;i>=l;i--)
    {
        v[i]=aux[--j];

    }
}