Cod sursa(job #438346)

Utilizator DetudaArthur Koestler Detuda Data 10 aprilie 2010 18:05:58
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 5.03 kb
#include <stdio.h>
#include <string.h>

	// nr gutui, inaltimea maxima, inaltarea, rezultatul final
	long n, hi, u, smax;
	// inantimea fiecarei gutui si greutatea
	long h[100001], w[100001], i, j, aux;
	long hmin, h1[100001], w1[100001], indici[100001], imax1, imax2, max1, max2, nrx, x;

void update()
{
	for(i=0; i<n; i++)
	h[i]+=u;
	// nu are sens sa pastram in vectorii h si w valorile pentru fructele care nu mai pot fi accesate (sunt prea sus)		
	j=0;
	for(i=0; i<n; i++)
	if(h[i]<=hi)
	{
		h1[j]=h[i];
		w1[j]=w[i];
		j++;
	}
	n=j;
	for(i=0; i<n; i++)
	{
		h[i]=h1[i];
		w[i]=w1[i];
	}
}

int main()
{
	FILE *f=fopen("gutui2.in", "r");
	FILE *g=fopen("gutui.out", "w");
	fscanf(f, "%ld %ld %ld", &n, &hi, &u);

	for(i=0; i<n; i++)
	fscanf(f, "%ld %ld", &h[i], &w[i]);
/*	for(i=0; i<n; i++)
	printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
*/
	//sortam descrescator fructele, in functie de inaltime
	//trebuie inlocuit cu quicksort, de exemplu
	for(i=0; i<n-1; i++)
	for(j=i+1; j<n; j++)
	if(h[i]<h[j])
	{
	aux=h[i];
	h[i]=h[j];
	h[j]=aux;
	aux=w[i];
	w[i]=w[j];
	w[j]=aux;
	}
	printf("Dupa quicksort: \n");
	for(i=0; i<n; i++)
	printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
	
	hmin=h[n-1];
	smax=0;
//	printf("hmin este: %ld\n", hmin);
//pana aici sigur e bine
	
	while(n>0)
	{	// fructele sunt mereu ordonate descrescator in functie de h[i]
		max1=0, imax1=-1, x=-1;
		printf("*************************\n");
		printf("Numarul de fructe este: %ld\n", n);
		for(i=0; i<n; i++)
			if(h[i]+u> hi) // primele x+1 numere sunt in pericol de a deveni inaccesibile dupa o culegere
			{
				x=i;
				if(w[i]>max1)
				{
					//printf("%ld este mai mic decat elementul cu greutatea %ld\n", max1, w[i]);
					imax1=i;
					max1=w[imax1];
				}
			} // la final vom avea x, indicele ultimului fruct in pericol, indicele fructului maxim din cele in pericol, si valoarea maxima
		printf("Cate fructe sunt in pericol: %ld\n", x+1);
		for(i=0; i<x+1; i++)
			printf("fruct in pericol: indice %ld de inaltime %ld si greutate %ld\n", i, h[i], w[i]);
		printf("maximul dintre fructele in pericol este fructul %ld de inaltime %ld si greutate %ld\n", imax1, h[imax1], w[imax1]);
if(x==-1)
{
	// daca x a ramas -1 atunci inseamna ca nu avem niciun fruct in pericol, si pur si simplu alegem maximul total
	max1=0, imax1=-1;
	//printf("oi \n");
	for(i=0; i<n; i++)
		if(w[i]>max1)
		{
			imax1=i;
			max1=w[imax1];
		}
	smax+=max1;
	for(i=imax1+1; i<n; i++)
	{	// stergem fructul cules
		h[i-1]=h[i];
		w[i-1]=w[i];
	}
	n--;
	//update();
	printf("Dupa culegere sunt %ld fructe:\n", n);
	for(i=0; i<n; i++)
	printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
	update();
	printf("Dupa update sunt %ld fructe:\n", n);
	for(i=0; i<n; i++)
	printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
	printf("suma in acest moment este %ld\n", smax);
	printf("*************************\n");
}
else
{
		// restul numerelor, nu sunt in pericol, vedem daca avem dintre acestea doua mai grele decat maximul dintre cele in pericol
		nrx=0;
		// daca x a ramas -1 atunci inseamna ca nu avem niciun fruct in pericol, si pur si simplu alegem maximul total
		for(i=x+1; i<n; i++)
			if(w[i]>max1)
				nrx++;
		// daca exista intre frunctele !in pericol 2 mai grele decat cel mai greu fruct in pericol
		if(nrx>=2)
		{
			printf("situatia speciala!\n");
			printf("exista 2 fructe mai grele in afara celor in pericol\n");
			imax2=-1, max2=0;
			for(i=x+1; i<n; i++)
			if(w[i]>max1)
			{
				max2=w[i];
				imax2=i;
			}
			smax+=max2; //adaugam greutatea fructului la suma totala
			for(i=imax2+1; i<n; i++)
			{	// stergem fructul cules
				h[i-1]=h[i];
				w[i-1]=w[i];
			}
			n--;
			//update();
			printf("Dupa culegere sunt %ld fructe:\n", n);
			for(i=0; i<n; i++)
			printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
			update();
			printf("Dupa update sunt %ld fructe:\n", n);
			for(i=0; i<n; i++)
			printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
			printf("suma in acest moment este %ld\n", smax);
			printf("*************************\n");
		}
		else
		{	//altfel, culegem fructul cu greutate maxima dintre fructele in pericol
			printf("situatia clasica!\n");
			smax+=max1; //adaugam greutatea fructului la suma totala
			for(i=imax1+1; i<n; i++)
			{	//stergem fructul cules
				h[i-1]=h[i];
				w[i-1]=w[i];
			}
			n--;
			//update();
			printf("Dupa culegere sunt %ld fructe:\n", n);
			for(i=0; i<n; i++)
			printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
			update();
			printf("Dupa update sunt %ld fructe:\n", n);
			for(i=0; i<n; i++)
			printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
			printf("suma in acest moment este %ld\n", smax);
			printf("*************************\n");
		}
}// de la else
	} // de la while(n>0)

/*
	printf("Ia sa vedem!\n");
	for(i=0; i<n; i++)
	printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
*/	
	
	
		
	printf("%ld\n", smax);
	fprintf(g, "%ld", smax);
	
	fclose(f);
	fclose(g);
	return 0;
}