Cod sursa(job #1035604)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 18 noiembrie 2013 18:11:05
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.23 kb
#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;
}