Pagini recente » Cod sursa (job #428486) | Cod sursa (job #2526911) | Cod sursa (job #3169374) | Cod sursa (job #1561505) | Cod sursa (job #645117)
Cod sursa(job #645117)
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define GMAX 210
#define CMAX 75010
#define INF 0x3f3f3f3f
int N, C, Gmax;
int F[GMAX];
void dinamica () {
int i, j, l;
int A[CMAX], B[CMAX];
int left, right, Deque[CMAX];
memset (A, INF, sizeof (A));
memset (B, INF, sizeof (B));
A[0] = 0; B[0] = 0;
for (i = 1; i <= Gmax; i++) {
for (l = i; l < (i << 1); l++) {
left = 1; right = 1;
Deque[1] = l - i;
for (j = l; j <= C; j+= i) {
while (left <= right && Deque[left] < j - F[i] * i) left++;
if (left <= right) B[j] = min(B[j], A[ Deque[left] ] + (j - Deque[left]) / i);
while (left <= right && (A[ Deque[right] ] + (j - Deque[right]) / i) > A[j]) right--;
Deque[++right] = j;
}
}
memcpy (A, B, sizeof (A));
}
for (i = C; i >= 1; i--)
if (A[i] != INF) {
printf ("%d %d\n", i, A[i]);
return ;
}
}
void citire () {
int i, g;
scanf ("%d %d", &N, &C);
for (i = 1; i <= N; i++) {
scanf ("%d", &g);
F[g]++;
Gmax = max (Gmax, g);
}
}
int main () {
freopen ("ghiozdan.in", "r", stdin);
freopen ("ghiozdan.out", "w", stdout);
citire ();
dinamica ();
return 0;
}