Cod sursa(job #881467)

Utilizator wzrdwzrd tst wzrd Data 18 februarie 2013 00:33:14
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <iostream>
#include <fstream>
#define DG 75555
#define DO 205
#define MULT (1<<30)
using namespace std;

int n,g,fr[DO],bst[2][DG],gmax,nmin;
int dq[DG],ind[DG],p=1,q=0;

int main()
{
    ifstream f("ghiozdan.in");
    ofstream out("ghiozdan.out");
    f>>n>>g;
    for(int i=0; i<n; ++i) {
      int x;
      f>>x;
      ++fr[x];
    }
    for(int j=0; j<=g; ++j) bst[0][j]=MULT;
    bst[0][0]=0;
    for(int i=1; i<DO; ++i) for(int gstart=0; gstart<i; ++gstart) {
      int act=i&1; int pre=act^1;
      p=1; q=0;
      for(int j=gstart; j<=g; j+=i) {
        bst[act][j]=MULT;
        for(;p<=q && ind[p]<j-fr[i]*i; ++p);
        for(;p<=q && dq[q]>=bst[pre][j]-j/i;--q);
        dq[++q]=bst[pre][j]-j/i;
        ind[q]=j;

        bst[act][j]=bst[pre][ind[p]]+(j-ind[p])/i;
        if(bst[act][j]!=MULT) {
          if(gmax<j) gmax=j,nmin=bst[act][j];
          else if(gmax==j) nmin=min(nmin,bst[act][j]);
        }
      }
    }


    out<<gmax<<' '<<nmin<<'\n';
    return 0;
}