Cod sursa(job #442711)

Utilizator carl1ontzataBacioi Florentina carl1ontzata Data 14 aprilie 2010 23:38:58
Problema Gutui Scor 60
Compilator cpp Status done
Runda teme_upb Marime 2.84 kb
/*U centimetri (cu cat se ridica crengile copacului la fiecare gutuie culeasa
H inaltimea maxima (la care poate ajunge Gigel cel cu capu chel
N-nr gutui din copac
g - greutatea unei gutui
fisier intrare avem:
       N       H    U
       u1     g1
       ....
       uN     gN 
       
       
fisier iesire vom avea:
       greutatea maxima pe care o poate culege Gigel( ceva gen suma celor mai bine alese gutui)
       
       
*/
//problema este rezolvata avand complexitatea O(n^2) 

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define INF 100000

// sortarea unui vector 
void sortare(int x[],int y[],int n)
{
  int temp,tempor,i,j;
  for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++)
         if (x[i]<x[j]){
            temp=x[i];
            x[i]=x[j];
            x[j]=temp;
            tempor=y[i];
            y[i]=y[j];
            y[j]=tempor;
            }
}

int main()
{
	int N, H, U;	// Nrul de gutui, Inaltimea la care ajunge Gigel, Cu cat se ridica creanga dupa ce este culeasa o gutuie
	int i, j, min, poz; 
	int *Number, *Sum, *renunt;
	//Number=nr gutui care sunt culese
	//Sum=suma ceruta, suma greutatilor gutuilor
	//renunt=daca se culege sau nu gutuia resp
	
	FILE *f1,*f2;
    f1=fopen("gutui.in","r"); 
    f2=fopen("gutui.out","w"); 
    fscanf(f1,"%d %d %d",&N,&H,&U);     //citire primul rand
    int  u[N+1], g[N+1];
    for(i=0;i<N;i++)
              fscanf(f1,"%d %d",&u[i],&g[i]);    //ciitrea inaltimilor si greutatilor corespunzatoare
	
	// sortat descrescator dupa inaltime
	sortare(u,g,N);
	
	renunt = (int *)malloc(N * sizeof(int));
	Sum = (int *)malloc(N * sizeof(int));
	Number = (int*)malloc(N * sizeof(int));
	
	Sum[0] = g[0];          // suma se initializeaza cu g[0], g[0] insemnand acum greutatea gutuii care se afla cel mai sus posibil
	Number[0] = 1;          // nr gutui culese=1
	
	for(i = 1; i < N; i++)
	{
		
		if((u[i] + Number[i - 1] * U) <= H)     // daca gutuia respectiva se mai poate culege, adica daca Gigel inca mai poate ajunge la ea
		{
			Sum[i] = Sum[i - 1] + g[i];  //se culege
			Number[i] = Number[i - 1] + 1;    //nr gutui se incrementeaza
		}
		else
		{
			// Nu putem citi gutuia i
			Number[i] = Number[i - 1];  // nr gutui ramane aceeasi
			Sum[i] = Sum[i - 1];        //suma ramane aceeasi
			min = INF;
			poz = 0;
			
			// Incercam sa renuntam la una culeasa, astfel incat daca renuntam la ea
			// si culegem o alta gutuie i, avem Sum mai mare
			
            for(j = 0; j < i; j++)
				if((renunt[j] == 0) && (min > g[j]))
				{
					min = g[j];
					poz = j;
				}
                	
			if(min < g[i])
			{
				renunt[poz] = 1;
				Sum[i] = Sum[i - 1] -g[poz] + g[i];
			}
			else
				renunt[i] = 1;
		}
	}	
				
	fprintf(f2,"%d",Sum[N-1]);				
				
	fclose(f1);
	fclose(f2);
	return 0;
}