Pagini recente » Cod sursa (job #1405171) | Cod sursa (job #1681299) | Cod sursa (job #2779494) | Cod sursa (job #2288320) | Cod sursa (job #1075022)
#include <iostream>
#include<fstream>
#include<algorithm>
#include<string.h>
using namespace std;
class Betiv
{
public:
int first , second , indice;
Betiv(int first , int second , int indice)
{
this->first = first;
this->second = second;
this->indice = indice;
}
Betiv()
{
first = 0;
second = 0;
indice = 0;
}
};
int n,l;
int vect[173];
Betiv timpi[173];
Betiv sol[173];
Betiv solmin[173];
Betiv copie[173];
int tmin=1000;
bool cmp(const Betiv & p1, const Betiv & p2)
{
double r1=(double)p1.first-(double)p1.second;
double r2=(double)p2.first-(double)p2.second;
return r1<r2;
}
bool cmp2(const Betiv & p1, const Betiv & p2)
{
return p1.indice < p2.indice;
}
int main()
{
ifstream in("lapte.in");
ofstream out("lapte.out");
in>>n>>l;
for(int i=0; i<n; i++)
{
in>>timpi[i].first>>timpi[i].second;
timpi[i].indice = i;
}
sort(timpi, timpi+n,cmp);
int left=0, right=100;
while (left<=right)
{
int m=(left+right)/2;
for (int i = 0; i < n ; i++)
{
vect[i] = m;
sol[i] = Betiv(0,0,timpi[i].indice);
}
int lapteA=l;
int lapteB=l;
for(int i=0; i<n && lapteA>0; i++)
{
int lapte=m/timpi[i].first;
if (lapte<=lapteA)
{
lapteA-=lapte;
vect[i]=0;
sol[i].first += lapte;
sol[i].indice = timpi[i].indice;
}
else
{
vect[i]-=lapteA*timpi[i].first;
sol[i].first += lapteA;
sol[i].indice = timpi[i].indice;
lapteA = 0;
}
}
for (int i=n-1; i>=0 && lapteB>0; i--)
{
int lapte=vect[i]/timpi[i].second;
if (lapte<=lapteB)
{
lapteB-=lapte;
vect[i]=0;
sol[i].second += lapte;
sol[i].indice = timpi[i].indice;
}
else
{
vect[i]-=lapteB*timpi[i].second;
sol[i].second+=lapteB;
sol[i].indice = timpi[i].indice;
lapteB = 0;
}
}
if (lapteA!=0 || lapteB!=0)
left=m+1;
else
{
if (m<tmin)
{
tmin=m;
for (int i=0;i<n;i++)
solmin[i]=sol[i];
}
right=m-1;
}
}
out << tmin << endl;
sort(solmin,solmin + n , cmp2);
for (int i=0; i<n; i++)
out<<solmin[i].first<<" "<<solmin[i].second<< endl;
return 0;
}