Cod sursa(job #442254)

Utilizator LagrangeLagrange Lagrange Data 14 aprilie 2010 00:09:58
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 3.31 kb
#include <stdio.h>
#include <string.h>
//functie de sortare rapida quicksort realizata dupa algoritmul de la curs
 void quickSort(int vect[][2], int stanga, int dreapta) {  
       int i = stanga, j = dreapta;  
       int aux1,aux2;  
       int pivot = vect[(stanga + dreapta) / 2][0];  
       while (i <= j) {  
             while (vect[i][0] < pivot)  
                   i++;  
             while (vect[j][0] > pivot)  
                   j--;  
             if (i <= j) {  
                   aux1 = vect[i][0];
                   aux2 = vect[i][1];  
                   vect[i][0] = vect[j][0];
                   vect[i][1] = vect[j][1];  
                   vect[j][0] = aux1;
                   vect[j][1] = aux2;  
                   i++;  
                   j--;  
             }  
       }  
       if (stanga < j)  
             quickSort(vect, stanga, j);  
       if (i < dreapta)  
             quickSort(vect, i, dreapta);  
 }
 void elimina(int index,int lung,int vect[][2]){
      int i;
      for (i=index;i<lung-1;i++){
          vect[i][0]=vect[i+1][0];
          vect[i][1]=vect[i+1][1];
          }
 }
int main(){
    FILE *in, *out;
    int i=0,j=0,U,n,H,a,niv,max=0,b,suma=0;   
    in=fopen("gutui.in","rt");                       //deschide fisierul pentru citire
    fscanf(in,"%i",&n);                              //citeste numarul de gutui
    int gutui[n][2];                                 //initializeaza structura de date reprezentata printr-o matrice de n x 2
    fscanf(in,"%i",&H);                              //citeste inaltimea maxima
    fscanf(in,"%i",&U);                              //citeste cu cat creste nivelul fiecarei gutui dupa ce a fost culeasa o gutui
    int vaux[H/U][2];
    for (i = 0; i < H/U; i++){
        vaux[i][0]=0;
        vaux[i][1]=0;
    }
    i=0;                                               //initializeaza o "coada de prioritati" in care se va pastra greutatea maxima de pe fiecare nivel
    while (!feof(in)) {                             
          fscanf(in,"%i",&a);
          fscanf(in,"%i",&gutui[i][1]);
          gutui[i][0]=(H-a)/(U+1);
          i++;
    }
    quickSort(gutui,0,n-1);
    niv=gutui[0][0];
    for (i=0;i<n;i++){
        if (niv==gutui[i][0]){
           if (gutui[max][1]<gutui[i][1])
              max=i;                       
        }                
        else {
             vaux[j][0]=gutui[max][0];
             vaux[j][1]=gutui[max][1];
             j++;
             elimina(max,n,gutui);
             i--;
             n--;        
             niv++;
             max=i;
        }    
    }
    vaux[j][0]=gutui[max][0];
    vaux[j][1]=gutui[max][1];
    elimina(max,n,gutui);
    n--;
    j++;
    for (i=0;i<n;i++){
        if (vaux[0][1]<gutui[i][1]){
           b=vaux[0][0];
           a=vaux[0][1];
           elimina(0,j,vaux);
           vaux[j-1][0]=gutui[i][0];
           vaux[j-1][1]=gutui[i][1];
           elimina(i,n,gutui);
           gutui[n-1][0]=b;
           gutui[n-1][1]=a;
        }
    }
                                                                                      
    for (i=0;i<j;i++)
        suma+=vaux[i][1];
    out=fopen("gutui.out","wt");
    fprintf(out,"%i",suma);    
    fclose(in);
    fclose(out);            
    return 0;
}