Cod sursa(job #676313)

Utilizator PatrikStepan Patrik Patrik Data 8 februarie 2012 23:14:24
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
	#include<stdio.h>
	FILE *f , *g ;
	int n , w , j ;
	struct{long p ,c;}v[1001],aux;
	long rez = 1000000000;
	
	void citire();
	void sort();
	void solve();
	void tipar();
	
	int main()
	{
		citire();
		sort();
		solve();
		tipar();
		return 0;
	}
	
	void citire()
	{
		f=fopen("energii.in" , "r" );
		fscanf(f , "%d%d" , &n , &w );
		for(int i = 1 ; i<= n ; ++i )
			fscanf(f , "%d%d" , &v[i].p , &v[i].c);
		fclose(f);
	}
	
	void sort()
	{
		int h = n;
		bool sw;
		while(h > 1)
		{
			h/=2;
			do
			{
				sw = 0;
				for(int i = 1 ; i<= n-h ; ++i )
					if(v[i].p > v[i+h].p)
					{
						aux = v[i];
						v[i] = v[i+h];
						v[i+h] = aux;
						sw = 1;
					}
			}while(sw);
		}
	}
	
	void solve()
	{
		for(int i = 1 ; i<= n ; ++i )
		{
			v[i].p+=v[i-1].p;v[i].c+=v[i-1].c;
			if(v[i].p < w)
				continue;
			j = i-1;
			while(v[i].p-v[j].p < w)
				j--;
			if(v[i].c-v[j].c < rez)
				rez = v[i].c-v[j].c;
		}
	}
	
	void tipar()
	{
		g=fopen("energii.out" , "w" );
		for(int i = 1 ; i<= n ; ++i )
			fprintf(g , "%d %d\n" , v[i].p , v[i].c );
		fprintf(g , "%ld" , rez);
		fclose(g);
	}