Cod sursa(job #434237)

Utilizator Cristea_AdrianCristea Adrian Cristea_Adrian Data 5 aprilie 2010 14:34:13
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 4.11 kb
#include <stdio.h>
#include <stdlib.h>

//Merge Sort

void mergeSort (int v[], int m[],int v2[], int v3[], int st, int dr) {
     int mij, p, k, st2, elem;
     if (dr > st) {
                mij = (st + dr) / 2; 
                    // se apeleaza recursiv functia pentru cele 2 jumatati
                mergeSort (v, m, v2, v3, st, mij);
                mergeSort (v, m, v2, v3, mij + 1, dr);
                
                mij ++;
                st2 = mij - 1;
                k = st;
                elem = dr - st + 1;
                     // se face interclasarea elementelor din prima si a doua jumatate a vectorului in unl temporar
                     // pana cand s-au epuizat elementele din una dintre ele
                while ((st <= st2) && (mij <= dr)) {
                      if (v[st] >= v[mij]) {
                         v2[k] = v[st];
                         v3[k] = m[st];
                         k ++;
                         st ++;
                         }
                      else {
                         v2[k] = v[mij];
                         v3[k] = m[mij];
                         k ++;
                         mij ++;
                         }
                      }
                      // se copiaza restul elementelor in vectorul temporar
                while (st <= st2) {
                      v2[k] = v[st];
                      v3[k] = m[st];
                      k ++;
                      st ++;
                      }
                while (mij <= dr) {
                      v2[k] = v[mij];
                      v3[k] = m[mij];
                      k ++;
                      mij ++;
                      }
                      // se scriu elementele inapoi in vectorul initial, dar de aceasta data sortate
                for (p = 0; p < elem; p ++) {
                    v[dr] = v2[dr];
                    m[dr] = v3[dr];
                    dr --;
                    }
                }
}


int main() {
    int h_max, nr_gutui, d_h;
    int i, j, min, pus=0, nr_niv, ok=1, niv_max;
    int *h, *masa, *prioritate, *temp1, *temp2;
    int maxim, strans=0;
    int marin, marir;
    
    FILE *in, *out;

    in=fopen("gutui.in","r");
    out=fopen("gutui.out","w");
    
    fscanf(in,"%d ", &nr_gutui);
    fscanf(in,"%d ", &h_max);
    fscanf(in,"%d", &d_h);
    
    h=(int *)malloc(nr_gutui*sizeof(int));
    masa=(int *)malloc(nr_gutui*sizeof(int));
    prioritate=(int *)malloc(nr_gutui*sizeof(int));
    temp1=(int *)malloc(nr_gutui*sizeof(int));
    temp2=(int *)malloc(nr_gutui*sizeof(int));
    
    for(i=0;i<nr_gutui;i++)
         fscanf(in,"\n%d %d",&h[i], &masa[i]);
         
    mergeSort(h,masa,temp1,temp2,0,nr_gutui-1);
    
    min=h[nr_gutui-1];
    nr_niv=(h_max-min)/d_h+1;
    for(i=0;i<nr_gutui;i++)
                           prioritate[i]=(h[i]-1)/d_h+1;
                           
    niv_max=h_max/d_h;
    
    for(i=0;i<nr_gutui;i++) {
         if(pus==nr_niv) break;
         if(h[i]+pus*d_h>h_max) continue;
         marin=0;
         marir=0;
         
         for (j=i+1;j<nr_gutui;j++) {
             if(prioritate[j]==prioritate[i]) {
                  if(masa[j]>masa[i]) {
                       marin++;
                       marir++;
                  }
             }
             else {
                  if(masa[j]>masa[i])
                       marir++;
             }
         }
         if (marir<nr_niv-pus) {
            if(prioritate[i]+pus+marin>niv_max)
                 continue;
            else {
                 strans+=masa[i];
                 pus++;
                 }
         }
         //printf("%d - %d %d %d %d\n",h[i],marin,marir,pus, strans);    
                            
                            }
         
        /* printf("\n");
    for(i=0;i<nr_gutui;i++)
         printf("%d %d %d\n",h[i], masa[i], prioritate[i]);
    
    printf("min=%d \nnivele=%d\nstrans=%d\n",min,nr_niv, strans);*/
    
    fprintf(out,"%d",strans);

    fclose(in);
    fclose(out);
        
        system("pause");
           
    return 0;
}