Cod sursa(job #2225863)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 28 iulie 2018 14:59:48
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int N,L,T,st,dr,CB[104][104],CA[104][104],SB,SA,tim;

struct viteza
{
   int vA,vB,ind;
}Lapte[101];

struct consum
{
    int c1,c2;
}Final[101];

void inter(int x,int m,int y)
{
    int i=x,j=m+1,k=x-1;
    struct aux
    {
        int A,B,poz;
    }A_lapte[101];
    while(i<=m&&j<=y)
    {
       if(Lapte[i].vB<=Lapte[j].vB)
       {
          A_lapte[++k].B=Lapte[i].vB;
          A_lapte[k].A=Lapte[i].vA;
          A_lapte[k].poz=Lapte[i].ind;
          i++;
          if(Lapte[i].vA==Lapte[i].vB) j++;
       }
       else
       {
           A_lapte[++k].B=Lapte[j].vB;
           A_lapte[k].A=Lapte[j].vA;
            A_lapte[k].poz=Lapte[j].ind;
           j++;
       }
    }
    while(i<=m)
    {
         A_lapte[++k].B=Lapte[i].vB;
          A_lapte[k].A=Lapte[i].vA;
           A_lapte[k].poz=Lapte[i].ind;
          i++;
    }
    while(j<=y)
    {
         A_lapte[++k].B=Lapte[j].vB;
          A_lapte[k].A=Lapte[j].vA;
           A_lapte[k].poz=Lapte[j].ind;
          j++;
    }
    for(int cnt=x;cnt<=k;cnt++)
    {
        Lapte[cnt].vB=A_lapte[cnt].B;
        Lapte[cnt].vA=A_lapte[cnt].A;
        Lapte[cnt].ind=A_lapte[cnt].poz;
    }
}

void sortare(int start,int stop)
{
    if(start<stop)
    {
        int mij=(start+stop)/2;
        sortare(start,mij);
        sortare(mij+1,stop);
        inter(start,mij,stop);
    }
}

int main()
{
    f>>N>>L;
    for(int i=1;i<=N;i++)
    f>>Lapte[i].vA,f>>Lapte[i].vB,Lapte[i].ind=i;
    sortare(1,N);
    st=0; dr=101;
   while(st<dr)
       {
        int mij=(st+dr)/2; SB=SA=0;
       for(int i=1;i<=N&&SB<L;i++)
        {
            int tot=mij/Lapte[i].vB;
            int rest=L-SB;
            if(rest<=tot) CB[mij][i]=rest;
            else CB[mij][i]=tot;

            SB+=CB[mij][i];
        }
       for(int i=1;i<=N&&SA<L;i++)
         {
             int tot=(mij-(CB[mij][i]*Lapte[i].vB))/Lapte[i].vA;
            CA[mij][i]=tot;

             SA+=CA[mij][i];
         }
        if(SA>=L&&SB>=L)
            {
                dr=mij-1,tim=mij;

                for(int i=1;i<=N;i++)
                {
                    if(CA[mij][i])  Final[Lapte[i].ind].c1=CA[mij][i];
                    else Final[Lapte[i].ind].c1=0;
                    if(CB[mij][i])  Final[Lapte[i].ind].c2=CB[mij][i];
                    else
                    Final[Lapte[i].ind].c2=0;
                }
            }
        else
         st=mij+1;
       }
     g<<tim<<'\n';
     for(int i=1;i<=N;i++)
        g<<Final[i].c1<<" "<<Final[i].c2<<'\n';
    return 0;
}