Pagini recente » Cod sursa (job #2505631) | Cod sursa (job #2625099) | Cod sursa (job #854881) | Cod sursa (job #1527300) | Cod sursa (job #19354)
Cod sursa(job #19354)
#include <stdio.h>
#include <queue>
using namespace std;
#define BUC 15
#define GMAX 75010
int N, G;
int nr[210];
int lin[20][GMAX];
int jeg[20][GMAX];
int aux[GMAX];
deque <pair<int, int> > deck[200];
int main()
{
int i, q, j, cur, urm, w, mod, cbuc;
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
scanf("%d %d", &N, &G);
for (i = 1; i <= N; i++) {
scanf("%d", &q);
nr[q]++;
}
for (cur = 1, urm = BUC, i = 1, cbuc = 1; i <= 200; cur = urm, urm += BUC, cbuc++) {
if (urm > 200) urm = 200;
for (j = 1; j <= urm - cur + 1; i++, j++) {
for (q = 0; q < i; q++) deck[q].clear();
for (q = 0; q <= G; q++) {
mod = q % i;
while (!deck[mod].empty() && deck[mod].front().second < q - nr[i] * i) deck[mod].pop_front();
if (jeg[j-1][q] || !q) {
w = jeg[j-1][q];
while (!deck[mod].empty() && deck[mod].back().first + (q - deck[mod].back().second) / i < w) deck[mod].pop_back();
deck[mod].push_back(make_pair(w, q));
}
if (!deck[mod].empty()) jeg[j][q] = deck[mod].front().first + (q - deck[mod].front().second) / i;
else jeg[j][q] = 0;
// printf("%d ", jeg[j][q]);
}
// printf("\n");
}
// printf("\n");
memcpy(lin[cbuc], jeg[1], sizeof(jeg[1]));
memcpy(jeg[0], jeg[j - 1], sizeof(jeg[0]));
}
int sol = 0;
for (i = 1; i <= G; i++) if (jeg[j-1][i]) sol = i;
printf("%d %d\n", sol, jeg[j-1][sol]);
fclose(stdin);
fclose(stdout);
return 0;
}