Pagini recente » Cod sursa (job #435693) | Cod sursa (job #1672919) | Cod sursa (job #2215899) | Cod sursa (job #2924760) | Cod sursa (job #442254)
Cod sursa(job #442254)
#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;
}