Cod sursa(job #1454385)

Utilizator allexx2200Atanasiu Alexandru-Marian allexx2200 Data 26 iunie 2015 13:16:32
Problema Numarare triunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <stdlib.h>

#define FIN "nrtri.in"
#define FOUT "nrtri.out"

#define SUCCES 0
#define ERROR 1

#define NMAX 800

FILE *in, *out;

int bete[NMAX];
int N, solution;

int compare (const void * a, const void * b) {
  return ( *(int*)a - *(int*)b );
}

int bin_search(int lower, int higher, int refer){
    while(lower < higher-1){
        int mid = lower + (higher - lower) / 2;

        if(refer == bete[mid]) {
            lower = mid;
            break;
        } else if(refer < bete[mid]){
            higher = mid;
        } else {
            lower = mid;
        }

    }

    return lower;
}

void solve(){
    qsort(bete, N, sizeof(int), compare);;

    for(int i=0; i < N-2; i++){
        for(int j=i+1; j < N-1; j++){

            int sum = bete[i] + bete[j];

            int index_higher = bin_search(j, N, sum);
            while(bete[index_higher+1] == sum) index_higher++;

            solution += (index_higher - j);
        }
    }
}

int main(){
    in = fopen(FIN, "rt");
    out = fopen(FOUT, "wt");
    if(!in || !out) return ERROR;
    fscanf(in, "%d", &N);
    for(int i=0; i < N; i++){
        fscanf(in, "%d", &bete[i]);
    }

    solve();

    fprintf(out, "%d", solution);

    fclose(in);
    fclose(out);
    return SUCCES;
}