Pagini recente » Cod sursa (job #2582997) | Cod sursa (job #2035565)
#include<fstream>
#include<cstring>
#define INF 1000000
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
int f[205], D[2][75005], T[2][75005], p, u, deq[20005];
void solve( int st, int dr, int G ){
if( G == 0 )
return;
if( st == dr ){
int nr = f[st];
while( nr != 0 && G != 0 ){
fout << st << "\n";
nr--;
G -= st;
}
return;
}
for( int i = 0; i <= G; i++ ){
D[0][i] = D[1][i] = INF;
}
int mid = ( st + dr ) / 2;
for( int i = st; i <= dr; i++ ){
if( f[i] == 0 )
continue;
D[0][0] = 0;
for( int j = 0; j < i; j++ ){
D[1][j] = D[0][j];
}
for( int r = 0; r < i; r++ ){
p = 1;
u = 0;
for( int j = i + r; j <= G; j += i ){
D[1][j] = D[0][j];
if( D[1][j] != INF )
T[1][j] = ( i <= mid ) ? j : T[0][j];
if( D[0][j - i] != INF ){
while( p <= u && D[0][j - i] + 1 < D[0][ deq[u] ] + ( j - deq[u] ) / i )
u--;
deq[++u] = j - i;
}
while( ( j - deq[p] ) / i > f[i] )
p++;
if( p <= u && D[1][j] > D[0][ deq[p] ] + ( j - deq[p] ) / i ){
D[1][j] = D[0][ deq[p] ] + ( j - deq[p] ) / i;
T[1][j] = ( i <= mid ) ? j : T[0][ deq[p] ];
}
}
}
memcpy( T[0], T[1], sizeof( T[1] ) );
memcpy( D[0], D[1], sizeof( D[1] ) );
}
int val = 0;
for( int i = G; i >= 1; i-- ){
if( D[0][i] != INF ){
val = i;
break;
}
}
if( st == 1 && dr == 200 ){
fout << val << " " <<D[0][val] << "\n";
}
int save = T[0][val];
solve( st, mid, save );
solve( mid + 1, dr, val - save );
}
int main(){
int n, G;
fin >> n >> G;
for( int i = 1; i <= n; i++ ){
int x;
fin >> x;
f[x]++;
}
solve( 1, 200, G );
return 0;
}