Cod sursa(job #438547)

Utilizator daniela.eneEne Daniela daniela.ene Data 10 aprilie 2010 21:05:32
Problema Gutui Scor 80
Compilator c Status done
Runda teme_upb Marime 3.55 kb
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h> 
#include <math.h>
//#define MAXX 4294967295UL

#define UINT_MAX 4294967295U


#define MAXX 1000000


//#define INT32_MAX 0x7fffffffL 
//#define UINT32_MAX (__CONCAT(INT32_MAX, U) * 2UL + 1UL) 
//#define UINT32_C(c) c ## UL
//#define MAXX 0x7fffffffL



typedef struct DATE {
	unsigned long int a;
	unsigned long int b;
	} date;
date in[MAXX];
date out[MAXX];


void merge(int low, int high, int mid) {
	int i, j, k;
	unsigned long int c[MAXX],d[MAXX];
	i=low;
	j=mid+1;
	k=low;
	while((i<=mid)&&(j<=high)) { // sortez dupa in.a
		//if(a[i]<a[j]) 
		if (in[i].a > in[j].a) {
			c[k]=in[i].a;
			d[k]=in[i].b;
			k++;
			i++;
		}
		else {
			c[k]=in[j].a;
			d[k]=in[j].b;
			k++;
			j++;
		}
	}
	while(i <= mid) {
		c[k]=in[i].a;
		d[k]=in[i].b;
		k++;
		i++;
	}
	while(j<=high){
		c[k]=in[j].a;
		d[k]=in[j].b;
		k++;
		j++;
	}
	for(i=low;i<k;i++) {
		in[i].a=c[i];
		in[i].b=d[i];
	}
} 



void mergesort( int low, int high) {
	int mid;
	if(low<high) {
		mid=(low+high)/2;
		mergesort(low,mid);
		mergesort(mid+1,high);
		merge(low,high,mid);
	}
}

int main () {
	
	FILE *f,*g;
	f=fopen("gutui.in","r");
	g=fopen("gutui.out","w");
	//unsigned long 
	unsigned long int n,h,u; // n:numar de gutui h: inamtimea max u:cu cat se ridica crengile
	unsigned long int min;
	fscanf (f, "%lu %lu %lu",&n,&h,&u);
	char c[100];
	fgets(c,MAXX,f); // sa ajung pe urm linie
	int i,j;
	
	unsigned long int gmax=0; // greutatea maxima
	
	for (i=0;i<n;i++) {
		fscanf (f, "%lu %lu",&in[i].a,&in[i].b);	
		fgets(c,MAXX,f);// \n
	}
	/*printf ("\n hi \n"); // print la citire
	for (i=0;i<n;i++)
		printf ("%lu ",in[i].a);
		
	printf ("\n ui \n");
	for (i=0;i<n;i++)
		printf ("%lu ",in[i].b);
		*/
	//sortare
	
	mergesort(0,n-1);
	
	printf ("\n sortat hi \n"); 
	for (i=0;i<n;i++)
		printf ("%lu ",in[i].a);
		
	printf ("\n sortat ui \n");
	for (i=0;i<n;i++)
		printf ("%lu ",in[i].b);
		
	
	//deci asadar si prin urmare
	//acum iau fiecare elem din hi vad daca pot sa il adaug la structura
	//daca pot il adaug : daca nu pot vad ce element as putea inlocui ai structura sa fie optima

	int k = 0; //contor pt a numara cate elem voi avea in out
	for (i = 0; i < n;i ++ )
		if (in[i].a <= h) {
			printf ("intru in primul if cu h %lu %lu \n",in[i].a,in[i].b); 
			out[k].a = in[i].a;
			out[k].b = in[i].b;
			gmax += in[i].b; //adaug la greutate
			if (h < u)
				h=0;
			else
				h -= u ; //scad inaltimea
			printf ("h ramas %lu \n",h);
			printf ("gmax %lu \n", gmax);
			k++; //cre sc nr de elem
		}
		else {
			
			min=out[0].b; 
			int pozmin=0;
			printf ("********************************************\n");
			for (j=1;j<k;j++) {
				
				if (out[j].b < min ) {
					min=out[j].b;
					pozmin=j;
					
				}
			}
			printf ( "minim############ %lu unde i= %d \n",min,i);
			
			printf ("ce vreau sa inlocuiesc ***** %lu %lu\n", in[i].a,in[i].b);	
			printf ("INAINTE ***** %lu %lu\n", out[pozmin].a,out[pozmin].b);
			if (k !=0)
				if ( in[i].b > min ) { 
				
					printf ("gmax inainte %lu\n",gmax);
					printf ( "ceea ce pun il loc %lu ce voi substitui %lu \n" , in[i].b , out[pozmin].b);
					gmax =gmax + in[i].b - out[pozmin].b;
					printf ("gmax dupa %lu\n",gmax);
					out[pozmin].a = in[i].a;
					out[pozmin].b = in[i].b;
					printf ("DUPA ***** %lu %lu\n", out[pozmin].a,out[pozmin].b);
				}
		}
	printf ("\n out a \n");	
	for (i=0;i<k;i++)
		printf ("%lu ",out[i].a);
		
	printf ("\n out b \n");
	for (i=0;i<k;i++)
		printf ("%lu ",out[i].b);
	printf ("\n greutate maxima la la la %lu \n" , gmax);	
		
	fprintf(g, "%lu\n",gmax);
		
		
	return 0;
}