Pagini recente » Cod sursa (job #1642471) | Cod sursa (job #1925307) | Cod sursa (job #2669614) | Cod sursa (job #986049) | Cod sursa (job #2035570)
#include<fstream>
#define DIM 75005
using namespace std;
int n, g, i, x;
int ff[205], d[2][DIM], t[2][DIM], dq[DIM];
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
void solve(int g, int st, int dr){
if(st == dr){
for(int i = 1; i <= g / st; i++){
fout<< st <<"\n";
}
return;
}
int i, j, r, p, u, k = 1, mid = (st + dr) / 2;
for(i = 1; i <= g; i++){
d[0][i] = 100000000;
}
for(i = st; i <= dr; i++){
for(r = 0; r < i; r++){
p = 1;
u = 0;
for(j = r; j <= g; j += i){
while(p <= u && d[1 - k][j] < d[1 - k][ dq[u] ] + (j - dq[u]) / i){
u--;
}
dq[++u] = j;
if(dq[p] == j - (ff[i] + 1) * i){
p++;
}
d[k][j] = d[1 - k][ dq[p] ] + (j - dq[p]) / i;
t[k][j] = t[1 - k][ dq[p] ];
if(i <= mid){
t[k][j] += j - dq[p];
}
}
}
k = 1 - k;
}
if(st == 1 && dr == 200){
for(i = g; i >= 1; i--){
if(d[1 - k][i] != 100000000){
fout<< i <<" "<< d[1 - k][i] <<"\n";
int a = t[1 - k][i];
solve(a, 1, mid);
solve(i - a, mid + 1, 200);
break;
}
}
}
else{
int a = t[1 - k][g];
solve(a, st, mid);
solve(g - a, mid + 1, dr);
}
}
int main(){
fin>> n >> g;
for(i = 1; i <= n; i++){
fin>> x;
ff[x]++;
}
solve(g, 1, 200);
return 0;
}