Cod sursa(job #1019056)

Utilizator Raducu1992Raducu Raducu1992 Data 30 octombrie 2013 16:29:02
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 2.08 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 interval(int limita,int N,int H)
{
    int i;
    for(i = N-1 ; i >= 0; i--)
    {
        if(v[i].inaltime >= limita+1 && v[i].inaltime <= H){
            return 1;
        }
    }
    return 0;
}
int main()
{
    int i,N,H,U,limita,min,cate_pun=0,b[1000],k=0,rez=0,M,HH;
    Date(&N,&H,&U);
    M = N; // M = rezerva lui N
    limita = H - U;
    HH = H;
    qsort( v, N, sizeof(struct gutui),compare);
    min = v[0].inaltime;
    i=N-1;
    while( limita > (min+1)-2*U )
    {                           // AICI GRESESC
        //if( H-min+U == N*U)
      //  {
      //      cate_pun = N;
     //       limita = -1;
     //   }
//else
      //  {
            cate_pun += interval(limita,N,HH);
            limita -= U;
            HH -= U;
      //  }
    }
    HH = H;
    limita = H - U;
    while(limita >= 0)
    {
        for(i = N-1; i >= 0; i--)
        {
            if(v[i].inaltime >= limita+1 && v[i].inaltime <= HH)
            {
                b[k] = v[i].greutate;
                k++;
            }
        }
        limita = limita - U;
        HH -= U;
    }
        qsort (b, k, sizeof(int), compare2);
        for(i = k-1 ; i >= k-cate_pun; i--)
        {
            rez += b[i];
        }
     //  printf("%d %d",rez,cate_pun);
   scrieDate(rez);
 return 0;
}