Cod sursa(job #2010508)

Utilizator Cudrici_CarinaCudrici Carina Cudrici_Carina Data 13 august 2017 13:39:25
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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";
}