Pagini recente » Cod sursa (job #1964042) | Cod sursa (job #1708547) | Cod sursa (job #1758714) | Niciomare | Cod sursa (job #2010508)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fi("lapte.in");
ofstream fo("lapte.out");
int N,L,Sol;
int SolB[110],SolC[110];
int B[110],C[110];
struct lapte{int first,second,nr;} A[110];
bool cmp (const lapte B ,const lapte C)
{
return B.first-B.second < C.first-C.second;
}
void citire()
{
fi >> N >> L;
for(int i=1; i<=N; i++)
{
fi >> A[i].first>>A[i].second;
A[i].nr=i;
}
}
int Ok(int val)
{
for(int i=0; i<=N; i++) B[i] = C[i] = 0;
int sum = 0;
for(int i=1; i<=N && sum < L; i++)
{
B[i] = min(val/A[i].first,L-sum);
sum += B[i];
}
if(sum < L) return 0;
sum = 0;
for(int i=N; i>=1; i--)
{
C[i] = min(val/A[i].second,L-sum);
sum += C[i];
}
if(sum < L) return 0;
for(int i=1; i<=N; i++)
if(A[i].first * B[i] + A[i].second * C[i] > val)
return 0;
return 1;
}
void cautare (int st,int dr)
{
int mij;
while(st<=dr)
{ mij=(st+dr)/2;
if(Ok(mij))
{
////////////
Sol=mij;
for(int i=1; i<=N; i++)
{SolC[A[i].nr] = C[i];
SolB[A[i].nr] = B[i];}
////////////
dr=mij-1;
}
else
st=mij+1;
}
}
int main()
{
citire();
sort(A+1,A+N+1,cmp);
cautare(1,100000);
fo << Sol << "\n";
for(int i=1; i<=N; i++)
fo << SolB[i] << " " << SolC[i] << "\n";
}