Cod sursa(job #1599144)

Utilizator touristGennady Korotkevich tourist Data 13 februarie 2016 17:28:58
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
#define Nmax 100005

using namespace std;

int C[Nmax],T[Nmax],n,m,v[Nmax];

class Parser {
 public:
  Parser(const char *path) {
    in.open(path);
    in.read(buffer, kSize);
    cursor = 0;
  }
  Parser& operator>>(int &x) {
    x = 0;
    while (buffer[cursor] < '0')
      advance();
    while (buffer[cursor] >= '0') {
      x = x * 10 + buffer[cursor] - '0';
      advance();
    }
    return *this;
  }
 private:
  void advance() {
    if (++cursor == kSize) {
      in.read(buffer, kSize);
      cursor = 0;
    }
  }
  static const int kSize = 500000;
  char buffer[kSize];
  int cursor;
  ifstream in;
};

inline bool Ok(long long x)
{
    int i;
    long long cnt=0;
    for(i=1;i<=n;++i)
    {
        cnt+=1LL*(x/T[i])*C[i];
        if(cnt>=m) return 1;
    }
    return 0;
}

int main()
{
    int i;
    Parser cin("garaj.in");
    ofstream cout("garaj.out");
    cin>>n>>m;
    for(i=1;i<=n;++i)
    {
        cin>>C[i]>>T[i];
        T[i]*=2;
    }
    long long st=0,dr=2000000000000,mij,sol;
    while(st<=dr)
    {
        mij=((st+dr)>>1);
        if(Ok(mij))
        {
            sol=mij; dr=mij-1;
        }
        else st=mij+1;
    }
    cout<<sol<<" ";
    for(i=1;i<=n;++i)
        if(1LL*(sol/T[i])*C[i] >=m)
        {
            cout<<"1\n"; return 0;
        }
        else v[i]=(sol/T[i])*C[i];
    sort(v+1,v+n+1);
    long long sum;
    for(i=n,sum=v[n];i && sum<m;--i,sum+=v[i]);
    cout<<n-i+1<<"\n";
    return 0;
}