Cod sursa(job #436721)

Utilizator arrowedgeDragos Dinu arrowedge Data 8 aprilie 2010 21:02:14
Problema Gutui Scor 50
Compilator c Status done
Runda teme_upb Marime 2.75 kb
#include <stdlib.h>
#include <stdio.h>

typedef struct {
        int *cont;
        int dim;
        }maxheap ;

void insert ( maxheap * Heap, int x){//functia de inserare (clasica) pentru maxheap reprezentat ca vector
     int poz =++Heap->dim;
     for( ; poz > 1 && x > Heap->cont[ poz / 2 ]; poz/= 2) 
                Heap->cont[poz] = Heap->cont[poz/2];
     Heap->cont[poz] = x;
    
     }

int main(){
    int N,H,U;
    FILE * f=fopen("gutui.in","r");
    fscanf(f,"%d %d %d\n", &N,&H,&U);
    
    int w[N],h[N];//vectori cu greutatile si inaltimile gutuilor
    
    int i,j;
    for (i=0;i<N;i++)
     fscanf(f, "%d %d\n", &h[i],&w[i]);
     for (i=0;i<N;i++)
     printf( "%d %d\n", h[i],w[i]);
     
     //calculam pentru fiecare gutuie, momentul de timp maxim (t) la care se poate culege 
     
     int t[N];
     for (i=0;i<N;i++) {
      t[i]=(H-h[i])/U+1;
      }
      
      
      //algoritmul alege gutuia cea mai grea care se poate alege la fiecare moment de timp, incepand cu cel mai indepartat
      
      //calculam maximul din vectorul t (sa stim cate momente de timp consideram)
      int max=t[0];
      for (i=1;i<N;i++) if (t[i]>max) max =t[i];
      
      maxheap heap[max+1];// un vector de heapuri (pentru fiecare moment de timp), primul element al heapului corespunzator 
                      //va contine gutuia cu greutate maxima (am folosit maxheap pentru a mari viteza aflarii celui mai mare element
      
      for (j=0;j<max;j++){
          heap[j].dim=0;//initializam heapul
          heap[j].cont=(int *)malloc(N*sizeof(int));
          }
          
      for (i=0;i<N;i++) //pentru fiecare gutuie
          insert(&heap[t[i]-1],w[i]);//adaugam greutatea gutuii in heapul corespunzator momentului de timp t[i] 
       
       
       for (i=0;i<max;i++){
           for (j=1;j<=heap[i].dim;j++) printf("%d ", heap[i].cont[j]);
           printf ("\n");
           }
        int aux=0;//calculam cate heap-uri sunt vide  
        int cant=0;//cantitatea de fructe culeasa
      
      for (i=max-1;i>0;i--){
        if (heap[i].dim>=1) cant=cant+heap[i].cont[1];// se culege gutuia si se adauga greutatea ei
         else aux++; //se incrementeaza numarul de alegeri care va ramane 
          for (j=2;j<=heap[i].dim;j++) insert (&heap[i-1],heap[i].cont[j]);
          }
          
          
      for (j=1;j<=aux+1;j++){ //pentru cate alegeri mai avem (aux +1)
        //alegem din primul heap (corespunzator celui mai apropiat moment de timp)
         cant=cant+heap[i].cont[1];
         }
          
          FILE * g=fopen("gutui.out", "w");
          fprintf(g,"%d",cant);
          fclose(g);
          
          }