Cod sursa(job #808581)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 6 noiembrie 2012 22:26:30
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
#include<string.h>
#define NMAX 107

int n,p,l,sol;

int rec[NMAX][NMAX],d[NMAX][NMAX];//d=dinamica

int a[NMAX],b[NMAX];

int dinamic(int x)
{
	
    int i, j, k;
	
    memset(d,-1,sizeof(d));
	memset(rec,0,sizeof(rec));
	
    d[0][0] = 0;
	
	//dinamica
    for(i=1;i<=n;++i)
        for(j=0;j<=l;++j)
            for(k=0;k<=j;++k)
                if(d[i-1][k]!=-1&&(j-k)*a[i]<=x)
				{
					
					int val;
					
					val=d[i-1][k]+(x-(j-k)*a[i])/b[i];
					
                    if(val>d[i][j])
					{
						
                        d[i][j]=val;
						
                        rec[i][j]=k;//reconstituire
						
                    }
					
				}

    if(d[n][l]>=l)
        return 1;

    return 0;
}

void cb(int st,int dr)
{
    int med;
	
    while(st<=dr)
	{
		
        med=(st+dr)/2;
		
        if(dinamic(med))
		{
			
            sol=med;
            dr=med-1;
			
        }
        else
			st=med+1;
    }
}

int main()
{
    int i;
	
    freopen ("lapte.in", "r", stdin);
    freopen ("lapte.out", "w", stdout);
	
    scanf("%d %d", &n,&l);
	
    for(i=1;i<=n;++i)
        scanf("%d %d",&a[i],&b[i]);
	
	cb(1,101);
	
    printf("%d\n",sol);
	
    dinamic(sol);
	
    p=l;
    for(i=n;i>=1;--i)
	{
		
        a[i]=p-rec[i][p];
        b[i]=d[i][p]-d[i-1][rec[i][p]];
        p=rec[i][p];
		
    }
	
    for(i=1;i<=n;++i)
        printf("%d %d\n",a[i],b[i]);
	
    return 0;
	
}