Pagini recente » Cod sursa (job #2907753) | Cod sursa (job #3252906) | Cod sursa (job #2469466) | Cod sursa (job #695908) | Cod sursa (job #2495511)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int const N = 1000;
ifstream fin("nrtri.in");
ofstream fout("nrtri.out");
int bs(int n, int Latura1, int Latura2, int LungimeBat[])
{
int inceput = 0;
int sfarsit = n - 1;
int PozitieValida = 0;
while (inceput != sfarsit)
{
int mijloc = (inceput + sfarsit) / 2;
if ((Latura1 + Latura2 > LungimeBat[mijloc]) && (Latura1 + LungimeBat[mijloc] > Latura2) && (Latura2 + LungimeBat[mijloc] > Latura1))
{
inceput = mijloc + 1;
PozitieValida = mijloc;
}
else
{
sfarsit = sfarsit - 1;
}
}
return PozitieValida - 2 + 1;
}
int main()
{
/** 3 laturi formeaza un triughi daca:
* a + b > c
* b + c > a
* a + c > b
** toate laturile triunghiului sunt diferite de 0
*/
int n, LungimeBat[N];
fin >> n;
int contor = 0;
for (int i = 0; i < n; i++)
{
fin >> LungimeBat[i];
}
sort(LungimeBat, LungimeBat + n);
for (int i = 0; i < n - 2; i++) // Nu vrem sa luam ultimele 2 nr din sir pt ca acestea nu vor avea alta latura cu care sa formeze un triunghi
{
contor += bs(n, LungimeBat[i], LungimeBat[i + 1], LungimeBat);
}
fout << contor;
}