Pagini recente » Cod sursa (job #2368233) | Cod sursa (job #896181) | Cod sursa (job #751698) | Cod sursa (job #2359150) | Cod sursa (job #508031)
Cod sursa(job #508031)
#include <cstdio>
using namespace std;
const int G = 75001;
const int N = 20001;
const int inf = N * G;
int s[205], n, g, a[2][G], current=1, prev=0, d[G], front, back, l, r;
int main() {
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
int i,j,k,x,c;
scanf("%d %d", &n, &g);
for(i = 1;i <= n; ++i)
{scanf("%d", &x); ++s[x]; if(x>r) r=x;}
for(i = 0;i <= 1; ++i)
for(j = 0;j <= g; ++j)
a[i][j] = inf;
a[0][0] = a[1][0] = 0;
for(i = 1;i <= r; ++i)
if(s[i])
{
for(j = 0;j < i; ++j) {
front = 1; back = 0 ;
c=0;
for(k = j; k <= g; k+=i) {
while(a[prev][k]+k/i<=a[prev][d[back]]+d[back]/i && front<=back)
--back;
++back;d[back]=k;
if(front<=back)
a[current][k]=a[prev][d[front]]+(k-d[front])/i;
while(k-d[front]>=s[i]*i&&front<=back)
++front;
}
}
// for(j=0;j<=g;++j)
// printf("%d ",a[current][j]);
// printf("\n");
current^=1;
prev^=1;
}
for(i=g;i>=0;--i)
if(a[prev][i]<inf)
{
printf("%d %d\n",i,a[prev][i]);
break;
}
return 0;
}