Pagini recente » Cod sursa (job #2625644) | Cod sursa (job #1080580) | Cod sursa (job #2706942) | Cod sursa (job #438343) | Cod sursa (job #442711)
Cod sursa(job #442711)
/*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;
}