Cod sursa(job #1274970)

Utilizator lokixdSebastian lokixd Data 24 noiembrie 2014 17:00:57
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
 
struct lapte{
    int a, b;
};
 
const int nmax = 106;
lapte v[nmax];
int n, d[nmax][nmax], mrasp[nmax][nmax], l, rasp, vrasp[nmax];
 
bool verificare(int x)
{
    for(int i = 0; i<=n; i++)
        for(int j = 0; j<=l; j++)
            d[i][j] = -100000000;
    d[0][0] = 0;
    for(int i = 1; i<=n; i++)
    {
        for(int j = 0; j<=l; j++)
        {
            for( int k = 0; k<=j && k * v[i].a<=x; k++)
            {
                int aux = (x - k * v[i].a) / v[i].b;
                if(d[i][j]<d[i - 1][j - k] + aux)
                {
                    d[i][j] = d[i - 1][j - k] + aux;
                    mrasp[i][j] = k;
                }
            }
        }
    }
 
    if(d[n][l]>=l)
        return 1;
    else
        return 0;
}
 
int bs()
{
    int hi = 106, lo = -1, mid;
    while(hi - lo>1)
    {
        mid = (hi + lo) / 2;
 
        if(verificare(mid)==1 && verificare(mid - 1)==0)
            return mid;
 
        if(verificare(mid)==1)
            hi = mid;
        else
            lo = mid;
    }
 
    if(verificare(mid)==1 && verificare(mid - 1)==0)
            return mid;
    if(verificare(hi)==1 && verificare(hi - 1)==0)
            return hi;
    if(verificare(lo)==1 && verificare(lo - 1)==0)
            return lo;
}
 
int main(){
    int player_unu=0;
 
    in>>n>>l;
    for(int i = 1; i<=n; i++)
    {
        in>>v[i].a>>v[i].b;
    }
 
    rasp = bs();
    verificare(rasp);
    out<<rasp<<'\n';
 
    int aux = n;
    while(aux!=0)
    {
        vrasp[aux] = mrasp[aux][l];
        l -= mrasp[aux][l];
        aux--;
    }
 
    for(int i = 1; i<=n; i++)
    {
        out<<vrasp[i]<<' '<<(rasp - vrasp[i] * v[i].a) / v[i].b<<'\n';
    }
 
    return player_unu;
}