Cod sursa(job #1081467)

Utilizator ioanapopaPopa Ioana ioanapopa Data 13 ianuarie 2014 17:29:36
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

int N,L,timpRamas[113];
int timpCautat = 1000;


struct om
{
	int laptea;
	int lapteb;
	int i;
};

om Persoane[113],solutieCurenta[113],solutieFinala[113];
bool greedy(const om & pers1, const om & pers2)
{
	return (pers1.laptea - pers1.lapteb) < (pers2.laptea - pers2.lapteb);
}

bool revenire(const om & pers1,const om & pers2)
{
	return pers1.i < pers2.i;
}


void CautareBin(int st , int dr)
{
	
	if(st<=dr)
	{
		int nebautA,nebautB;
		int mij = (st+dr)/2;
		for(int i = 0 ; i < N ; i ++)
			{
				timpRamas[i] = mij;
				solutieCurenta[i].laptea = 0 ;
				solutieCurenta[i].lapteb = 0;
				solutieCurenta[i].i = Persoane[i].i;
			}
		nebautA=L;
		nebautB=L;
		for(int i=0; i<N && nebautA>0 ; i++)
        {
					int lapte=mij/Persoane[i].laptea;
					if (lapte<=nebautA)
					{
						nebautA=nebautA-lapte;
						timpRamas[i]=0;
						solutieCurenta[i].laptea =solutieCurenta[i].laptea + lapte;
					}
					else
					{
						timpRamas[i]=timpRamas[i]-nebautA*Persoane[i].laptea;
						solutieCurenta[i].laptea =solutieCurenta[i].laptea + nebautA;
						nebautA = 0;
					}
			
		 }
		for(int i = N-1 ; i>=0 && nebautB>0;i--)
			{
			
					
						int lapte =timpRamas[i]/Persoane[i].lapteb;
						if(lapte<=nebautB)
						{
							nebautB=nebautB-lapte;
							timpRamas[i]=0;
							solutieCurenta[i].lapteb=solutieCurenta[i].lapteb+lapte;
						}
						else
						{
							timpRamas[i]=timpRamas[i]-nebautB*Persoane[i].lapteb;
							solutieCurenta[i].lapteb=solutieCurenta[i].lapteb+nebautB;
							nebautB=0;
					   }
				
			}
				if(nebautA!=0 || nebautB!=0)
					st = mij+1;
				else
				{
					if(mij<timpCautat)
					{
						timpCautat = mij;
						for(int i = 0 ; i < N ; i++)
							{
								solutieFinala[i].laptea = solutieCurenta[i].laptea;
								solutieFinala[i].lapteb = solutieCurenta[i].lapteb;
								solutieFinala[i].i= solutieCurenta[i].i;
							}
					}
					dr = mij-1;
				}
				CautareBin(st,dr);
	}


}


int main()
{
	ifstream f("lapte.in");
	ofstream g("lapte.out");

	f>>N>>L;
	for(int i= 0 ; i < N ; i++)
		{
			f>>Persoane[i].laptea>>Persoane[i].lapteb;
			Persoane[i].i = i;
		}
	sort(Persoane,Persoane+N,greedy);
	CautareBin(0,100);
	g<<timpCautat<<endl;
	sort(solutieFinala,solutieFinala+N,revenire);
	for(int i = 0 ; i< N ; i++)
		g<<solutieFinala[i].laptea<<" "<<solutieFinala[i].lapteb<<endl;
	return 0;
}