Cod sursa(job #137491)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 17 februarie 2008 12:26:56
Problema Garaj Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.99 kb
#include <fstream>
std::ifstream f1("garaj.in");
std::ofstream f2("garaj.out");
struct elem
{
	int c, t;
};//struct elem

int part(struct elem sir[100010], int jos, int sus);
void qsort(struct elem sir[100010], int jos, int sus);
int part2(struct elem sir[100010], int jos, int sus);
void qsort2(struct elem sir[100010], int jos, int sus);

struct elem camion[100010];

int main()
{
	long n, m, i, total, j;
	long long timp, fol[100010];
	f1>>n>>m;
	for (i=0; i<n; i++)
		f1>>camion[i].c>>camion[i].t;
	qsort2(camion, 0, n-1);
	qsort(camion, 0, n-1);
  timp=0;
	total=1;
	while (m>0)
	{
		m-=camion[0].c;
		timp+=camion[0].t;
		fol[0]+=camion[0].t;
		j=1;
		while ((m>0)&&(j<n))
		{
      while ((fol[j]+camion[j].t)<=timp)
			{
				if (fol[j]==0)
					total++;
				fol[j]+=camion[j].t;
				m-=camion[j].c;
			}//while
			j++;
		}//while j
	}//while
	timp*=2;
	f2<<timp<<" "<<total;
	f1.close();
	f2.close();
	return 0;
}//main

int part2(struct elem sir[2010], int jos, int sus)
{
  int p=jos, q=sus;
	struct elem temp;
	while (p<q)
	{
		while ((p<=q)&&(sir[p].c<=sir[jos].c))
		  p++;
		while ((p<=q)&&(sir[q].c>sir[jos].c))
		  q--;
    if (p<q)
		{
			temp=sir[p];
			sir[p]=sir[q];
			sir[q]=temp;
		}//if
	}//while	
	temp=sir[q];
	sir[q]=sir[jos];
	sir[jos]=temp;
	return q;
}//part2

void qsort2(struct elem sir[2010], int jos, int sus)
{
	int p;
	if (jos<sus)
	{
		p=part2(sir, jos, sus);
		qsort2(sir, jos, p-1);
		qsort2(sir, p+1, sus);
	}//if
}//qsort2

int part(struct elem sir[2010], int jos, int sus)
{
  int p=jos, q=sus;
	struct elem temp;
	while (p<q)
	{
		while ((p<=q)&&((sir[p].c/sir[p].t)>=(sir[jos].c/sir[jos].t)))
		  p++;
		while ((p<=q)&&((sir[q].c/sir[q].t)<(sir[jos].c/sir[jos].t)))
		  q--;
    if (p<q)
		{
			temp=sir[p];
			sir[p]=sir[q];
			sir[q]=temp;
		}//if
	}//while	
	temp=sir[q];
	sir[q]=sir[jos];
	sir[jos]=temp;
	return q;
}//part

void qsort(struct elem sir[2010], int jos, int sus)
{
	int p;
	if (jos<sus)
	{
		p=part(sir, jos, sus);
		qsort(sir, jos, p-1);
		qsort(sir, p+1, sus);
	}//if
}//qsort