Cod sursa(job #1075022)

Utilizator SovStoStoicescu Mihail Cristian SovSto Data 8 ianuarie 2014 13:23:56
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#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;
}