Cod sursa(job #20447)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 21 februarie 2007 15:18:39
Problema Ghiozdan Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
using namespace std;
#include<stdio.h>
#include<deque>

#define NMAX 210
#define GMAX 75000

void read();

int N, G, nr[NMAX], A[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());
          }
          }
     }
     for(i = G; i >= 0; i--)
     if(A[!ok][i] != GMAX) break;
     
     printf("%d %d\n", i, A[!ok][i]);
}