Cod sursa(job #1945975)

Utilizator hrazvanHarsan Razvan hrazvan Data 29 martie 2017 20:10:39
Problema Ghiozdan Scor 6
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#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;
}