Cod sursa(job #85333)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 20 septembrie 2007 22:48:43
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <string>

#define maxn 20010
#define maxx 75010
#define maxk 210

int n,m,p,r;
int a[maxn];
int c[maxx],d[maxx],v[maxx];
int C[maxk];

int main()
{
    freopen("ghiozdan.in","r",stdin);
    freopen("ghiozdan.out","w",stdout);
    
    scanf("%d %d ",&n,&m);
    
    int i,j,k;
    
    for (i=1;i<=n;i++) 
    {
        scanf("%d ",&a[i]);
        C[a[i]]++;
    }
    
    c[0]=0;
    for (i=1;i<=m;i++) c[i]=maxn;

    for (i=1;i<maxk;i++)
    {
        memcpy(d,c,sizeof(c));
        for (j=0;j<i;j++)
        {
            p=r=0;
            v[0]=j;
            for (k=j+i;k<=m;k+=i)
            {
                while ((p<=r) && (d[v[r]]+(k-v[r])/i>=d[k])) r--;
                r++;
                v[r]=k;
                
                while (v[p]<k-i*C[i]) p++;
                if ((p<=r) && (d[v[p]]+(k-v[p])/i<c[k])) c[k]=d[v[p]]+(k-v[p])/i;
            }
        }
    }
    
    for (i=m;i>0;i--)
      if (c[i]!=maxn) 
      {
           printf("%d %d\n",i,c[i]);
           break;
      }
    
    return 0;
}