Cod sursa(job #1018873)

Utilizator Raducu1992Raducu Raducu1992 Data 30 octombrie 2013 00:49:56
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 1.57 kb
#include <stdio.h>
#include<stdlib.h>
struct gutui
{
    int greutate,inaltime;
};
struct gutui *v;
void Date(int *N, int *H, int *U)
{
    int i;
    FILE *f = fopen("gutui.in", "rt");
    fscanf(f, "%i%i%i", N,H,U);
    v = (struct gutui*)malloc((*N)*sizeof(struct gutui));
    for(i = 0; i < *N; ++i)
    {
        fscanf(f, "%i", &v[i].inaltime);
        fscanf(f, "%i", &v[i].greutate);
    }
    fclose(f);
}
int compare(const void *x, const void *y){
    return ((struct gutui *)x)->inaltime  - ((struct gutui *)y)->inaltime;
}
int compare2(const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
void scrieDate(int greutateFinal)
{
    FILE *f = fopen("gutui.out","w");
     fprintf(f,"%d",greutateFinal);
    fclose(f);
}
int main()
{
    int i,N,H,U,limita,min,cate_pun=0,b[100000],k=0,rez=0,M;
    Date(&N,&H,&U);
    M = N; // M = rezerva lui N
    limita = H - U;
    qsort( v, N, sizeof(struct gutui),compare);
    min = v[0].inaltime;
    while( min <= H )
    {
        cate_pun++;
        min += U;
    }
    while(limita >= 0)
    {
        for(i = N-1; i >= 0; i--)
        {
            if(v[i].inaltime >= limita)
            {
                b[k] = v[i].greutate;
                k++;
            }
            else
            {
                break;
            }
        }
        limita = limita - U;
        N = M - k;
    }
        qsort (b, k, sizeof(int), compare2);
        for(i = k-1 ; i >= k-cate_pun; i--)
        {
            rez += b[i];
        }
   scrieDate(rez);
 return 0;
}