Pagini recente » Cod sursa (job #2956362) | Cod sursa (job #1168607) | Cod sursa (job #2669758) | Cod sursa (job #488652) | Cod sursa (job #1945975)
#include <cstdio>
#include <vector>
#define MAXN 200
#define MAXG 75000
#define pb push_back
typedef struct{
int t, p, nr;
}din;
int fr[MAXN + 1];
din d[MAXG], dn[MAXG];
std::vector<int> dq[MAXN + 1];
int sq[MAXN + 1];
int main(){
FILE *in = fopen("ghiozdan.in", "r");
int n, g, i, x, j;
fscanf(in, "%d%d", &n, &g);
for(i = 0; i < n; i++){
fscanf(in, "%d", &x);
fr[x]++;
}
fclose(in);
d[0].nr = 1;
for(i = 1; i <= MAXN; i++){
if(fr[i] != 0){
dn[0].nr = 1;
for(j = 0; j <= MAXN; j++){
dq[j].clear();
sq[j] = 0;
}
dq[0].pb(0);
for(j = 1; j <= g; j++){
dn[j].p = dn[j].nr = dn[j].t = 0;
x = j % i;
if(sq[x] < dq[x].size() && dq[x][sq[x]] < j - fr[i] * i)
sq[x]++;
if(sq[x] < dq[x].size()){
dn[j] = d[dq[x][sq[x]]];
dn[j].nr = (j - dq[x][sq[x]]) / i;
dn[j].t += dn[j].nr;
dn[j].p = j - i * dn[j].nr;
}
if(d[j].t != 0){
while(dq[x].size() > sq[x] && d[*(dq[x].end() - 1)].t + (j - (*(dq[x].end() - 1))) / i > d[j].t)
dq[x].erase(dq[x].end() - 1);
dq[x].pb(j);
}
}
for(j = 0; j <= MAXN; j++){
if(dn[j].t != 0 && (d[j].t == 0 || (d[j].t != 0 && d[j].t > dn[j].t)))
d[j] = dn[j];
}
}
}
while(g >= 0 && d[g].t == 0)
g--;
FILE *out = fopen("ghiozdan.out", "w");
fprintf(out, "%d %d\n", g, d[g].t);
/*while(g != 0){
for(i = 0; i < d[g].nr; i++)
fprintf(out, "%d\n", (g - d[g].p) / d[g].nr);
g = d[g].p;
}*/
fclose(out);
return 0;
}