Pagini recente » Cod sursa (job #1949826) | Cod sursa (job #21920) | Cod sursa (job #2864573) | Cod sursa (job #3164698) | Cod sursa (job #2601210)
#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;}
}