Pagini recente » Cod sursa (job #1797446) | Cod sursa (job #2895374) | Cod sursa (job #3252799) | Cod sursa (job #2460835) | Cod sursa (job #20457)
Cod sursa(job #20457)
using namespace std;
#include<stdio.h>
#include<deque>
#define NMAX 210
#define GMAX 75100
void read();
void gorec(int a, int b, int x);
int N, G, nr[NMAX], A[2][GMAX], B[2][GMAX];
deque<int> Q;
int main()
{
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
read();
return 0;
}
void read()
{
int a, i, ok, j, k;
scanf("%d%d", &N, &G);
for(i = 0; i < N; i++)
{
scanf("%d", &a);
nr[a]++;
}
for(i = 1; i <= G; i++)
A[0][i] = GMAX;
for(i = 1, ok = 1; i <= 200; i++, ok = !ok)
{
for(j = 0; j < i; j++)
{
while(!(Q.empty()))
Q.pop_back();
for(k = 0; k * i + j <= G; k++)
{
A[ok][k * i + j] = GMAX;
while(!(Q.empty()) && k - (*Q.begin()) > nr[i])
Q.pop_front();
while(!(Q.empty()) && A[!ok][Q[Q.size() - 1] * i + j] + k - Q[Q.size() - 1] >= A[!ok][k * i + j])
Q.pop_back();
Q.push_back(k);
if(A[!ok][(*Q.begin()) * i + j] != GMAX)
{
A[ok][k * i + j] = A[!ok][(*Q.begin()) * i + j] + k - (*Q.begin());
B[ok][k * i + j] = (i <= 100) ? k * i + j : B[!ok][(*Q.begin()) * i + j];
}
}
}
}
for(i = G; i >= 0; i--)
if(A[!ok][i] != GMAX) break;
printf("%d %d\n", i, A[!ok][i]);
j = B[!ok][i];
gorec(1, 100, B[!ok][i]);
gorec(101, 200, i - j);
}
void gorec(int a, int b, int x)
{
int i, j, k, ok, old;
if(a > b) return;
if(a == b)
{
for(; x; x -= a)
printf("%d\n", a);
return;
}
for(i = 1; i <= x; i++)
A[0][i] = GMAX;
for(i = a, ok = 1; i <= b; i++, ok = !ok)
{
for(j = 0; j < i; j++)
{
while(!(Q.empty()))
Q.pop_back();
for(k = 0; k * i + j <= x; k++)
{
A[ok][k * i + j] = GMAX;
B[ok][k * i + j] = 0;
while(!(Q.empty()) && k - (*Q.begin()) > nr[i])
Q.pop_front();
while(!(Q.empty()) && A[!ok][Q[Q.size() - 1] * i + j] + k - Q[Q.size() - 1] >= A[!ok][k * i + j])
Q.pop_back();
Q.push_back(k);
if(A[!ok][(*Q.begin()) * i + j] != GMAX)
{
A[ok][k * i + j] = A[!ok][(*Q.begin()) * i + j] + k - (*Q.begin());
B[ok][k * i + j] = (i <= ((a + b) / 2)) ? k * i + j : B[!ok][(*Q.begin()) * i + j];
}
}
}
}
old = B[!ok][x];
gorec(a, (a + b) / 2, B[!ok][x]);
gorec((a + b) / 2 + 1, b, x - old);
}