Cod sursa(job #2601210)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 14 aprilie 2020 03:47:14
Problema Ghiozdan Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("ghiozdan.in");
ofstream g("ghiozdan.out");

const int inf=25000;
int N,G,help[75005],v[2][75005],fr[205],x;
bool OK=0;
deque<int>coada;

int main()
{
f>>N>>G;
for(int i=1;i<=N;i++) f>>x,fr[x]++;
for(int z=0;z<=1;z++)
 for(int i=1;i<=G;i++)
  v[z][i]=inf;
for(int i=200;i>=1;i--)
     if(fr[i]!=0) {
                      for(int j=0;j<i;j++){
                        if(v[OK][j]!=inf) coada.push_front(j);
                        for(int z=i+j;z<=G;z+=i){
                             while( !coada.empty()&&(z-coada.back())/i>fr[i] ) coada.pop_back();
                             if( !coada.empty() ) v[1-OK][z]=min(v[OK][z],v[OK][coada.back()]+(z-coada.back())/i);
                             else v[1-OK][z]=v[OK][z];
                             if(v[OK][z]!=inf){
                                while( !coada.empty()&&v[OK][coada.front()]+(z-v[OK][coada.front()])/i>=v[OK][z] ) coada.pop_front();
                                coada.push_front(z);
                             }
                        }
                        while( !coada.empty() ) coada.pop_back();
                      }
                      OK=1-OK;
                  }
for(int i=G;i>=1;i--)
if(v[OK][i]!=inf) {g<<i<<" "<<v[OK][i]; return 0;}
}