Pagini recente » Cod sursa (job #2080696) | Cod sursa (job #2392991) | Cod sursa (job #2647068) | Cod sursa (job #1810542) | Cod sursa (job #1575686)
#include <cstdio>
#include <algorithm>
#define INF 2000000000000LL
#define lint long long
using namespace std;
int n, m, i, T[100010], C[100010];
lint timp, timpst, timpdr, t[100010];
char s[1000010];
lint numar(lint timp) {
// se da timp si sa aflu numarul maxim de sticle de transportat in timp
lint nr = 0;
for (i=1;i<=n;i++) {
nr = nr + timp/T[i]*C[i];
}
return nr;
}
int main () {
FILE *fin = fopen("garaj.in", "r");
FILE *fout = fopen("garaj.out", "w");
fscanf(fin,"%d%d\n",&n,&m);
// ia din fisierul fin maxim 1000010 de componente de 1 octet
// si le pune in tabloul s
fread(s, 1, 1000010, fin);
int val = 0;
int p = 0;
int k = 0;
for (i=0;s[i]!=0;i++) {
if (s[i] >= '0' && s[i] <= '9') {
val = val * 10 + s[i] - '0';
} else
if (s[i-1] >= '0' && s[i-1] <= '9') {
// am obtinut un nou numar in val
if (p == 0) {
k++;
C[k] = val;
p = 1;
} else {
T[k] = 2*val;
p = 0;
}
val = 0;
}
}
if (val != 0)
T[k] = 2*val;
// for (i=1;i<=n;i++) {
// fscanf(fin,"%lld%lld",&C[i],&T[i]);
// T[i] *= 2;
// }
timpst = 1;
timpdr = INF;
while (timpst <= timpdr) {
timp = (timpst + timpdr)/2;
if (numar(timp) < m)
timpst = timp + 1;
else
timpdr = timp - 1;
}
// cu acest timp minim gasit sa alegem un numar minim de camioane
for (i=1;i<=n;i++)
t[i] = timpst/T[i]*C[i];
sort(t+1, t+n+1);
i = n;
while (m>=0) {
m -= t[i];
if (m <= 0)
break;
i--;
}
fprintf(fout, "%lld %d\n",timpst, n-i+1);
return 0;
}