Cod sursa(job #438458)

Utilizator liviurLiviu Razorea liviur Data 10 aprilie 2010 19:40:22
Problema Gutui Scor 10
Compilator cpp Status done
Runda teme_upb Marime 4.41 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct {
        long int h; 
        long int hInitial;
        long int g;
        int culeasa; // variabila bool
} gutui;

int existaParaAccesibila(gutui v[], long N) {
    long i;
    for (i = 0; i < N; i++)
        if (v[i].h > 0)
           return 1;
    return 0;
}

long int nr_pasi(long int H, long int h, long int U) {     // de verificat
    long int i;
    i = H - h;
    if (i < 0)
       return 0;
    
    i = i / U;
    
    return i + 1;
}

 
int cmp(const void *x1, const void *x2) {
    long int h1, h2, g1, g2;
    long diferenta;
    
    h1 = ((gutui *)x1)-> h;
    g1 = ((gutui *)x1)-> g;
    
    h2 = ((gutui *)x2)-> h;
    g2 = ((gutui *)x2)-> g;
    
    if (h1 <= 0)
       return 1;
    if (h2 <= 0)
       return -1;
    
    if (h1 > h2)
       return 1;
    if (h1 == h2) {
       diferenta = g2 - g1;
       if (diferenta > 0)
          return 1;
       if (diferenta < 0)
          return -1;
       
       return 0;
    }
    if (h1 < h2)
       return -1;
    
    
}

int main () {
    FILE *fp;
    long NGutuiCulese = 0;
    long NGutuiRamase;
    long N, i, j, k;
    long int H, U, cantitate_max;
    gutui *v; 
    gutui aux;
    gutui *gutuiCulese, *gutuiRamase;
    int EPA; // variabila booleana care precizeaza daca exista para accesibila 

    
    fp = fopen("gutui.in", "r");
    fscanf(fp, "%ld%ld%ld", &N, &H, &U);
        
    v = (gutui *)malloc(N * sizeof(gutui));
    for (i = 0; i < N; i++) {
        fscanf(fp, "%ld%ld", &v[i].h, &v[i].g);
        v[i].culeasa = 0;
    }
        
    fclose(fp);
   
    // afisare date citite
//1    printf("%d  %d  %d\n", N, H, U);
/*2    for (i = 0; i < N; i++)
        printf("%d %d\n", v[i].h, v[i].g);
*/
    // h va retine numarul de pasi efectuati in procesul de recoltare
    // a gutuilor dupa care ele devin inaccesibile
    for (i = 0; i < N; i++) 
        v[i].h = v[i].hInitial = nr_pasi(H, v[i].h, U);

/*5
    printf("\n\nVector prelucrat:\n");
    for (i = 0; i < N; i++)
        printf("%d %d\n", v[i].h, v[i].g);
*/    
    cantitate_max = 0;
    EPA = existaParaAccesibila(v, N);
    while (EPA) {
          qsort(v, N, sizeof(gutui), cmp);
/*3    
          printf("\n\nVector sortat:\n");
          for (i = 0; i < N; i++)
              printf("%d %d\n", v[i].h, v[i].g);
*/              
/*          long j= 0;
          long pasi = v[0].h;
          while (j < N) {
                
                j++;
          } */
 
          v[0].culeasa = 1;
          NGutuiCulese ++;
          
          cantitate_max += v[0].g;
          v[0].h = 0;
          
          for (i = 0; i < N; i++)
              v[i].h --;
              
//4          printf("cantitate: %d\n", cantitate_max);
          EPA = existaParaAccesibila(v, N);
    }
    
    NGutuiRamase = N - NGutuiCulese;
    gutuiCulese = (gutui *)malloc(NGutuiCulese * sizeof(gutui));
    gutuiRamase = (gutui *)malloc(NGutuiRamase * sizeof(gutui));
    
    j = k = 0;
    for (i = 0; i < N; i++)
        if (v[i].culeasa) {
           gutuiCulese[j] = v[i];
           gutuiCulese[j].h = gutuiCulese[j].hInitial;
           j++; 
        }
        else    {
                gutuiRamase[k] = v[i];
                gutuiRamase[k].h = gutuiRamase[k].hInitial;
                k++;
        }
        
//    printf("NGutuiCulese -- j :: %d -- %d\n", NGutuiCulese, j);
//    printf("NGutuiRamase -- k :: %d -- %d\n", NGutuiRamase, k);

      i = 0; 
      while (i < NGutuiCulese) {
      qsort(gutuiCulese, NGutuiCulese, sizeof(gutui), cmp);
      qsort(gutuiRamase, NGutuiRamase, sizeof(gutui), cmp);
      
      for (j = 0; j < NGutuiRamase; j++)
          if (gutuiRamase[j].g > gutuiCulese[i].g) {
/*6             if (gutuiRamase[j].h <= gutuiCulese[i].h)
                printf("EROARE\n");
*/                
             cantitate_max = cantitate_max - gutuiCulese[i].g;
             
             aux = gutuiCulese[i];
             gutuiCulese[i] = gutuiRamase[j];
             gutuiRamase[j] = aux;
             
             cantitate_max = cantitate_max + gutuiCulese[i].g;
          }
          
      i++;
      }

//7    printf("cantitate: %d\n", cantitate_max);
      fp = fopen("gutui.out", "w");
      fprintf(fp, "%ld", cantitate_max);
      fclose(fp);
    
//8    system("pause");
    return 0;
}