Cod sursa(job #1542869)

Utilizator stoianmihailStoian Mihail stoianmihail Data 5 decembrie 2015 19:02:45
Problema Energii Scor 5
Compilator c Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <limits.h>

/**  Algoritm problema "Energii":
 *        -  cand j < W, 
 *        - costul minim necesar pentru a obtine energia "j".
 * d[j] = ---------------------------------------------------
 *        -  cand j >= W,
 *        - costul minim necesar pentru a obtine energie "j"(mai exact, pentru a
 *         porni centrala).
 *
**/

#define Nadejde 5000

int G, W;
int d[Nadejde + 1];

/** Initializeaza vectorul "d". **/
void init() {
  int i;
  for (i = 0; i <= W; i++) {
    d[i] = INT_MAX;
  }
  d[0] = 0;
}

/** Afla minimul dintre "curr" si d[pos]. **/
void compare(int curr, int pos) {
  if (curr < d[pos]) {
    d[pos] = curr;
  }
}

int main(void) {
  int i, j, e, c;
  FILE *f = fopen("energii.in", "r");

  /* Citirea datelor. */
  fscanf(f, "%d %d", &G, &W);
  init();
  
  /* Calcularea solutiei. */
  for (i = 0; i < G; i++) {
    fscanf(f, "%d %d", &e, &c);
    for (j = W; j >= 0; j--) {
      if (d[j] != INT_MAX) {
        if (j >= W) {
          compare(d[j] + c, W);
        } else {
          compare(d[j] + c, j + e);
        }
      }
    }
  }
  fclose(f);

  /* Afisarea solutiei. */
  f = fopen("energii.out", "w");
  fprintf(f, "%d\n", d[W] == INT_MAX ? -1 : d[W]);
  fclose(f);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}