Cod sursa(job #1566095)

Utilizator SilviuIIon Silviu SilviuI Data 11 ianuarie 2016 19:49:56
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define nmax 110

using namespace std;
struct date { int x,y; };

int n,k,st,dr,sol;
int dp[nmax][nmax],path[nmax][nmax];
date t[nmax];

// dp[i][j] nr maxim de litri de lapte cei pot bea din sticla B daca 
// au baut deja i prieteni si sau baut j litri din sticla A.

bool ok(int x)
{
	memset(dp,-1,sizeof(dp));
	memset(path,0,sizeof(path));
	dp[0][0]=0;
	for (int i=1;i<=n;i++) {
		for (int j=0;j<=k;j++)
		    if (dp[i-1][j]>=0) {
		    	for (int l=0;l+j<=k;l++)
		    	    if ((x-l*t[i].x)>=0) {
		    	    	if (dp[i][j+l]<dp[i-1][j]+(x-l*t[i].x)/t[i].y) {
		    	    		dp[i][j+l]=dp[i-1][j]+(x-l*t[i].x)/t[i].y;
							path[i][j+l]=j;
						}
				    } else break;
			}
	}
	return (dp[n][k]>=k);
}

void findpath(int lv,int x)
{
	if (lv==0) return; else
	{
		findpath(lv-1,path[lv][x]);
		int dif=x-path[lv][x];
		printf("%d %d\n",dif,dp[lv][x]-dp[lv-1][path[lv][x]]);
	}
}

int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d %d",&n,&k);
	for (int i=1;i<=n;i++) scanf("%d %d",&t[i].x,&t[i].y);
	st=1; dr=50000;
	while (st<=dr) {
		int m=(st+dr)/2;
		if (ok(m)) {
			sol=m; dr=m-1;
		} else st=m+1;
	}
	ok(sol);
	printf("%d\n",sol);
	findpath(n,k);
	return 0;
}