Pagini recente » Cod sursa (job #1704575) | Cod sursa (job #659042) | Cod sursa (job #1348359) | Cod sursa (job #2793162) | Cod sursa (job #1599144)
#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;
}