Pagini recente » Borderou de evaluare (job #3338373) | Borderou de evaluare (job #3303122) | Borderou de evaluare (job #3303114) | Borderou de evaluare (job #3309659) | Cod sursa (job #3338246)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("garaj.in");
ofstream fout("garaj.out");
bool can(long long X,int N,long long M,vector<int>& C,vector<int>& T){
long long total=0;
for(int i=0;i<N;i++){
long long trips=X/(2LL*T[i]);
if(trips>0){
total+=trips*C[i];
if(total>=M)return true;
}
}
return false;
}
int main(){
int N;
long long M;
fin>>N>>M;
vector<int> C(N),T(N);
for(int i=0;i<N;i++){
fin>>C[i]>>T[i];
}
long long left=0,right=1;
while(!can(right,N,M,C,T)){
right*=2;
}
while(left<right){
long long mid=(left+right)/2;
if(can(mid,N,M,C,T)){
right=mid;
}else{
left=mid+1;
}
}
long long Tmin=left;
vector<long long> capacity;
for(int i=0;i<N;i++){
long long trips=Tmin/(2LL*T[i]);
if(trips>0){
capacity.push_back(trips*C[i]);
}
}
sort(capacity.begin(),capacity.end(),greater<long long>());
long long sum=0;
int Nrmin=0;
for(long long x:capacity){
sum+=x;
Nrmin++;
if(sum>=M)break;
}
fout<<Tmin<<" "<<Nrmin;
return 0;
}