Pagini recente » Cod sursa (job #1371307) | Cod sursa (job #2530656) | Cod sursa (job #1745778) | Cod sursa (job #2215517) | Cod sursa (job #516961)
Cod sursa(job #516961)
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define maxn 75010
#define maxw 210
#define inf 2000000000
int n, gmax, i, j, k, w, sol, v[maxw];
int d[2][maxn], p[2][maxn], dq[maxn];
int dinamica(int left, int right, int g, int tip)
{
if(left==right)
{
for(int i=1; i<=g/left; ++i)
printf("%d\n", left);
return 0;
}
int med=(left+right)/2;
for(int i=1; i<=g; ++i)
d[0][i]=inf;
for(int i=left; i<=right; ++i)
{
for(int j=0; j<i; ++j)
{
int l=1, r=0;
for(int k=j, cnt=0; k<=g; k+=i, ++cnt)
{
if(dq[l]<k-v[i]*i && l<=r)
++l;
while(d[0][k]<d[0][dq[r]]+cnt-dq[r]/i && l<=r)
--r;
dq[++r]=k;
d[1][k]=d[0][dq[l]]+cnt-dq[l]/i;
if(i<=med)
p[1][k]=k;
else
p[1][k]=p[0][dq[l]];
}
}
for(int j=0; j<=g; ++j)
{
d[0][j]=d[1][j];
p[0][j]=p[1][j];
d[1][j]=inf;
p[1][j]=0;
}
}
if(tip==1)
{
int rez=g;
while(d[0][rez]==inf)
--rez;
return rez;
}
int g1=p[0][g];
dinamica(left, med, g1, 0);
dinamica(med+1, right, g-g1, 0);
return 0;
}
int main()
{
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
scanf("%d%d", &n, &gmax);
for(int i=1; i<=n; ++i)
{
scanf("%d", &k);
v[k]++;
w=max(w, k);
}
sol=dinamica(1, w, gmax, 1);
printf("%d %d\n", sol, d[0][sol]);
k=dinamica(1, w, sol, 0);
return 0;
}