Pagini recente » Istoria paginii utilizator/martinmiere133 | Cod sursa (job #153966) | Cod sursa (job #493364) | Cod sursa (job #1559619) | Cod sursa (job #138380)
Cod sursa(job #138380)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const char iname[] = "garaj.in";
const char oname[] = "garaj.out";
typedef long long i64;
vector <int> C, T;
i64 work(int n, i64 delta)
{
i64 cnt = 0;
for (int i = 0; i < n; ++ i)
cnt += ((i64)(delta / (2 * T[i]))) * C[i];
return cnt;
}
int main(void)
{
FILE *fi, *fo;
int n, nr;
fi = fopen(iname, "r");
fscanf(fi, "%d %d", &n, &nr);
C.resize(n);
T.resize(n);
for (int i = 0; i < (int)n; ++ i)
fscanf(fi, "%d %d", &C[i], &T[i]);
fclose(fi);
const i64 inf = (i64)(2e12);
i64 delta, stp;
for (stp = 1; stp <= inf; stp <<= 1) ;
for (delta = 0; stp; stp >>= 1) if (delta + stp <= inf)
if (work(n, delta + stp) < nr)
delta += stp;
if (work(n, delta) < nr)
delta ++;
for (int i = 0; i < n; ++ i)
C[i] = ((i64)(delta / (2 * T[i]))) * C[i];
sort(C.begin(), C.end());
reverse(C.begin(), C.end());
i64 cnt = 0;
int res = 0;
for (int i = 0; i < n; ++ i)
{
cnt += C[i];
res ++;
if (cnt > nr)
break ;
}
fo = fopen(oname, "w");
fprintf(fo, "%lld %d\n", delta, res);
fclose(fo);
return 0;
}