Cod sursa(job #991264)

Utilizator danutbodbodnariuc danut danutbod Data 30 august 2013 10:28:26
Problema Numarare triunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
//varianta I  100p cu cautare binara O(n^2*log(n))
#include <fstream>
#include<algorithm>
using namespace std;
ifstream f("nrtri.in");
ofstream g("nrtri.out");
int i,j,k,n,t,nrsol,s,p,a[1000];
int cauta_bin(int x)//returneaza pozitia primului element
{                    //mai mare ca x !!!!!!!!
    int st,dr,mij;
    st=1;dr=n;
    while(st<dr){
      mij=(st+dr)/2;
      if(a[mij]<=x)st=mij+1;
      else dr=mij-1;
    }
    if(x>=a[st])return st+1;
     else return st;
}
int main()
{
    f>>n;
    for(i=1;i<=n;i++)f>>a[i];
    sort(a+1,a+n+1);
    for(i=1;i<=n-2;i++)
      for(j=i+1;j<=n-1;j++){
          s=a[i]+a[j];
          p=cauta_bin(s);
          nrsol+=p-j-1;//p-j-1 este numarul de solutii
      }                //pentru perechea a[i] si a[j]
    g<<nrsol<<'\n';
    g.close();
    return 0;
}
/*
//varianta II  70p nu se incadreaza in timp O(n^3)
#include <fstream>
using namespace std;
ifstream f("nrtri.in");
ofstream g("nrtri.out");
int i,j,k,n,t,a[1000];
int main()
{
    f>>n;
    for(i=1;i<=n;i++)f>>a[i];
    for(i=1;i<=n-2;i++)
      for(j=i+1;j<=n-1;j++)
        for(k=j+1;k<=n;k++)
         if(a[i]+a[j]>=a[k]&&a[i]+a[k]>=a[j]&&a[k]+a[j]>=a[i])t++;
    g<<t<<'\n';
    g.close();
    return 0;
}*/