Pagini recente » Cod sursa (job #1272390) | Cod sursa (job #812894) | Cod sursa (job #2901812) | Cod sursa (job #285575) | Cod sursa (job #1410943)
#include<cstdio>
#include<deque>
#define INF 2000000000
using namespace std;
deque<int>q;
int n,m,nr,a,b,k,i,j,v[20500],x[250],d[2][76000],t[2][76000];
FILE *f,*g;
void rez(int sst,int ddr,int m){
int st=sst;
int dr=ddr;
while(x[st]==0&&st<=dr)
st++;
while(x[dr]==0&&dr>=st)
dr--;
if(m==0)
return;
if(st==dr){
i=1;
int s=0;
while(s<=m&&i<=x[st]){
s+=st;
i++;
fprintf(g,"%d\n",st);
}
return;
}
nr=0;
for(i=st;i<=dr;i++){
t[0][i]=i;
if( i%st || i/st>x[st] )
d[0][i]=INF;
else
d[0][i]=i/st;
}
int mid=(st+dr)/2;
for(i=0;i<=m;i++){
d[1][i]=INF;
if(!d[0][i])
d[0][i]=INF;
}
for(i=st;i<=dr;i++){
if(x[i]){
for(k=0;k<i;k++){
q.clear();
for(j=k;j<=m;j+=i){
while(!q.empty()&&d[1][j]<=d[0][ q.front() ]){
q.pop_back();
}
if(d[0][j]!=INF)
q.push_back(j);
while( (j-q.front())/i >= x[i] && !q.empty() ){
q.pop_front();
}
if(!q.empty()){
a=d[0][ q.front() ] + (j-q.front())/i;
if(a<d[1][j]){
d[1][j]=a;
if(j<=mid)
t[1][j]=j;
else
t[1][j]=t[0][ q.front() ];
}
}
}
}
for(k=0;k<=m;k++){
d[0][k]=d[1][k];
d[1][k]=INF;
t[0][k]=t[1][k];
t[1][k]=INF;
}
}
}
for(nr=m;nr>=1;nr--){
if(d[0][nr]!=INF)
break;
}
if(sst==1&&ddr==200)
fprintf(g,"%d %d\n",nr,d[0][nr]);
nr=t[0][nr];
rez(st,mid,nr);
rez(mid+1,dr,m-nr);
}
int main(){
f=fopen("ghiozdan.in","r");
g=fopen("ghiozdan.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&v[i]);
x[ v[i] ]++;
}
rez(1,200,m);
fclose(f);
fclose(g);
return 0;
}