Pagini recente » Cod sursa (job #3281455) | Cod sursa (job #1677469) | Cod sursa (job #2878360) | Cod sursa (job #2497747) | Cod sursa (job #1041932)
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
int timp_max,minim;
int n; // nr persoane;
int L; //cat lapte trebuie baut
pair<int, pair<int, int> > v[102];// v<x<y,z>> pers x bea lapte a in y timpi si lapte b in z timpi
pair<int, int> aux[102];
pair<int, int> sol[102];
void getData(){
ifstream in("lapte.in");
in>>n>>L;
for (int i = 1; i<=n; ++i){
int a,b;
in>>a>>b;
int c = max(a,b);
timp_max = max(c, timp_max);
v[i].first = i;
v[i].second = pair<int, int> (a,b);
}
in.close();
}
bool compara1 ( const pair<int, pair<int, int> >& A, const pair<int, pair<int, int> >& B){
return A.second.first - A.second.second < B.second.first - B.second.second;
}
bool compara2 (const pair<int, pair<int, int> >&A, const pair<int, pair<int, int> >&B){
return A.first<B.first;
}
void init(){
for (int i=1; i<=n; ++i)
aux[i].first = aux[i].second = 0;
}
void update(){
for(int i=1; i<=n; ++i){
sol[v[i].first].first = aux[i].first;
sol[v[i].first].second = aux[i].second;
}
}
bool ok (int T){
init();
int A = 0, B = 0;
for (int i=1; i<=n ; ++i){
int cat = T/v[i].second.first;
aux[i].first = min(cat, L-A), A+=aux[i].first;
}
for (int i= n; i>=1; --i){
int cat = T/v[i].second.second;
aux[i].second = min(cat, L-B),B+=aux[i].second;
}
if (A<L || B<L ) return false;
for (int i=1; i<=n;++i){
int t1 = v[i].second.first*aux[i].first;
int t2 = v[i].second.second*aux[i].second;
if (t1+t2>T) return false;
}
return true;
}
void cauta (int st, int dr){
if(st>dr) return;
int mij = (st+dr)/2;
if ( ok(mij) ){
minim = mij;
update();
cauta(st,mij-1);
}else {
cauta(mij+1,dr);
}
}
int main(){
getData();
sort(v+1,v+n+1,compara1);
timp_max = timp_max*10000;
cauta(1,timp_max);
ok(minim);
ofstream out("lapte.out");
out<<minim<<"\n";
for (int i=1; i<=n;i++)
out<<aux[i].first<<" "<<aux[i].second<<"\n";
return 0;
}