Cod sursa(job #2236171)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 28 august 2018 14:58:10
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>
#define NMAX 105
#define INF 0x3f3f3f3f
#define MOD 1000003
#define pb push_back
#define x first
#define y second

using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

int n,l,fa[NMAX],fb[NMAX];
struct copil {
	int a,b,dif,ind;
} v[NMAX];

bool comp(copil A, copil B) {
	return A.dif<B.dif;
}

bool possible(int val) {
	int i,a=0,b=0;

	for(i=1;i<=n;++i) {
		if(l-a < val/v[i].a) {
			fa[v[i].ind] = l-a;
			a+=l-a;
		}
		else {
			a+=val/v[i].a;
			fa[v[i].ind] = val/v[i].a;
		}
	}

	for(i=n;i>0;--i) {
		if(l-b < (val-v[i].a*fa[v[i].ind])/v[i].b) {
			fb[v[i].ind] = l-b;
			b+=l-b;
		}
		else {
			b+=(val-v[i].a*fa[v[i].ind])/v[i].b;
			fb[v[i].ind] = (val-v[i].a*fa[v[i].ind])/v[i].b;
		}
	}

	return a==l && b==l;
}

int main() {
	int i,st,dr,mid;

	fin>>n>>l;

	for(i=1;i<=n;++i) {
		fin >> v[i].a>>v[i].b;
		v[i].dif = v[i].a-v[i].b;
		v[i].ind = i;
	}

	sort(v+1,v+n+1,comp);

	st=1;
	dr=10000;
	while(st<=dr) {
		mid=(st+dr)/2;
		if(possible(mid))
			dr=mid-1;
		else st=mid+1;
	}

	fout << st <<'\n';
	for(i=1;i<=n;++i) fout << fa[i] << ' ' << fb[i] << '\n';

	return 0;
}