Pagini recente » Cod sursa (job #845748) | Cod sursa (job #1013028) | Cod sursa (job #2325546) | Cod sursa (job #2064656) | Cod sursa (job #2035861)
# include <fstream>
# include <deque>
# define DIM 75010
# define INF 1000000000
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
deque<int> q;
int d[DIM],t[DIM],ct[DIM],cp[DIM],f[205],n,g,i,j,k,x;
void solve(int st,int dr,int g){
int i,j,k,nr,mij=(st+dr)/2;
for(i=1;i<=g;i++){
d[i]=cp[i]=INF;
t[i]=0;
ct[i]=0;
}
if(st>dr)
return;
for(i=st;i<=dr;i++){
for(k=1;k<=i;k++){
q.clear();
if(k==i)
q.push_back(0);
for(j=k;j<=g;j+=i){
while(!q.empty()&&d[q.back()]+(j-q.back())/i>d[j])
q.pop_back();
q.push_back(j);
if((j-q.front())/i>f[i])
q.pop_front();
cp[j]=min(cp[j],d[q.front()]+(j-q.front())/i);
if(j<=mij)
ct[j]=t[q.front()]+((j-q.front())/i)*i;
if(i==dr&&j==g)
nr=(j-q.front())/i;
}
}
for(j=1;j<=g;j++){
d[j]=cp[j];
cp[j]=INF;
t[j]=ct[j];
ct[j]=0;
}
}
for(i=1;i<=nr;i++)
fout<<dr<<"\n";
solve(st,mij,t[g]);
solve(mij+1,dr,d[g]-t[g]);
}
int main () {
fin>>n>>g;
for(i=1;i<=n;i++){
fin>>x;
f[x]++;
}
for(i=1;i<=g;i++)
d[i]=cp[i]=INF;
for(i=1;i<=200;i++){
for(k=1;k<=i;k++){
q.clear();
if(k==i)
q.push_back(0);
for(j=k;j<=g;j+=i){
while(!q.empty()&&d[q.back()]+(j-q.back())/i>d[j])
q.pop_back();
q.push_back(j);
if((j-q.front())/i>f[i])
q.pop_front();
cp[j]=min(cp[j],d[q.front()]+(j-q.front())/i);
}
}
for(j=1;j<=g;j++){
d[j]=cp[j];
cp[j]=INF;
}
}
for(j=g;j>=1;j--)
if(d[j]!=INF){
fout<<j<<" "<<d[j]<<"\n";
g=j;
break;
}
// solve(1,200,g);
return 0;
}