Cod sursa(job #1041942)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 26 noiembrie 2013 13:27:07
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#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 && A<L; ++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;
}

int cauta (int st, int dr){

  if(st>dr) return st;
  int mij = (st+dr)/2;
  if ( ok(mij) ){
    update();
    return cauta(st,mij-1);
  }else {
    return cauta(mij+1,dr);
  }
}


int main(){

  getData();
  sort(v+1,v+n+1,compara1);
  timp_max = timp_max*10000;
  minim = cauta(1,timp_max);

  ofstream out("lapte.out");
  out<<minim<<"\n";
  for (int i=1; i<=n;i++)
    out<<aux[i].first<<" "<<aux[i].second<<"\n";
  return 0;


}