Pagini recente » Cod sursa (job #553019) | Cod sursa (job #1655261) | Cod sursa (job #69565) | Cod sursa (job #427673) | Cod sursa (job #1035604)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
vector<int> a, b, ind_a, ind_b;
int viz_a[101], viz_b[101], i, j, n, t, l;
void fill_viz_a()
{
for(int i = 0; i <= 100; i++)
viz_a[i] = 0;
}
void fill_viz_b()
{
for(int i = 0; i <= 100; i++)
viz_b[i] = 0;
}
bool cmp_a (int x, int y)
{
if(a[x] > a[y])
return 0;
else
if( a[x] == a[y] && b[x] < b[y] )
return 0;
return 1;
}
bool cmp_b (int x, int y)
{
if(b[x] > b[y])
return 0;
else
if( b[x] == b[y] && a[x] < a[y] )
return 0;
return 1;
}
void read()
{
fin>>n>>l;
int x, y;
for(int i = 0; i < n; i++ )
{
fin>>x>>y;
a.push_back(x);
b.push_back(y);
ind_a.push_back(i);
ind_b.push_back(i);
}
}
bool valid(int t)
{
int l_aux = l;
fill_viz_a();
fill_viz_b();
for( int i = 0; i < n && l_aux != 0 ; i++ )
{
if( l_aux >= t/a[ ind_a[i] ] )
{
l_aux -= t/a[ ind_a[i] ];
viz_a[ ind_a[i] ] = t;
}
else
{
viz_a[ ind_a[i] ] = l_aux * a[ ind_a[i] ];
l_aux = 0;
}
}
if(l_aux != 0 )
{/*
cout<<t<<" false1";
for(int i = 0; i < n; i++ )
cout<<"\n"<<viz_a[i]<<" "<<viz_b[i];
*/return false;
}
l_aux = l;
for( int i = 0; i < n && l_aux != 0 ; i++ )
{
if( l_aux >= ( t - viz_a[ ind_b[i] ] ) / b[ ind_b[i] ] )
{
l_aux -= (t-viz_a[ ind_b[i]] ) / b[ ind_b[i] ];
viz_b[ind_b[i]] = t-viz_a[ind_b[i]];
}
else
{
viz_b[ind_b[i]] = l_aux * b[ ind_b[i] ];
l_aux = 0;
}
}
if(l_aux == 0)
{/*
cout<<t<<" true1";
for(int i = 0; i < n; i++ )
cout<<"\n"<<viz_a[i]<<" "<<viz_b[i];
*/return true;
}
//****************************************************************
fill_viz_a();
fill_viz_b();
l_aux = l;
for( int i = 0; i < n && l_aux != 0 ; i++ )
{
if( l_aux >= t/b[ ind_b[i] ] )
{
l_aux -= t/b[ ind_b[i] ];
viz_b[ind_b[i]] = t;
}
else
{
viz_b[ind_b[i]] = l_aux * b[ ind_b[i] ];
l_aux = 0;
}
}
if(l_aux != 0 )
{
/* cout<<t<<" false2";
for(int i = 0; i < n; i++ )
cout<<"\n"<<viz_a[i]<<" "<<viz_b[i];*/
return false;
}
l_aux = l;
for( int i = 0; i < n && l_aux != 0 ; i++ )
{
if( l_aux >= ( t - viz_b[ind_a[i]] ) / a[ ind_a[i] ] )
{
//cout<<"\nviz_a[ind_b[i]] "<<viz_b[ind_a[i]];
//cout<<"*** "<<l_aux<<" ";
l_aux -= (t-viz_b[ind_a[i]]) / a[ ind_a[i] ];
//cout<<" "<<l_aux<<"*** ";
viz_a[ind_a[i]] = t-viz_b[ind_a[i]];
}
else
{
viz_a[ind_a[i]] = l_aux * a[ ind_a[i] ];
l_aux = 0;
}
}
if( l_aux == 0 )
{
/*cout<<t<<" true2";
for(int i = 0; i < n; i++ )
cout<<"\n"<<viz_a[i]<<" "<<viz_b[i];*/
return true;
}
else
{/*
cout<<t<<" false3";
for(int i = 0; i < n; i++ )
cout<<"\n"<<viz_a[i]<<" "<<viz_b[i];
*/return false;
}
}
int find_t(int left, int right)
{
if( left == right && valid(left) )
return left;
int med = ( left + right ) / 2;
if(valid(med))
return find_t(left, med);
else
return find_t(med+1, right);
}
void solve()
{
sort(ind_a.begin(), ind_a.end(), cmp_a);
sort(ind_b.begin(), ind_b.end(), cmp_b);
/*for(i=0;i<n;i++)
cout<<a[ind_a[i]]<<" "<<b[ind_a[i]]<<"\n";
cout<<"\n";
for(i=0;i<n;i++)
cout<<a[ind_b[i]]<<" "<<b[ind_b[i]]<<"\n";
cout<<"*****************\n";*/
t = find_t (1, 100);
fout<<t;
for(int i = 0; i < n; i++ )
fout<<"\n"<<viz_a[i]/a[i]<<" "<<viz_b[i]/b[i];
}
int main()
{
read();
solve();
return 0;
}