Submission #589931

#TimeUsernameProblemLanguageResultExecution timeMemory
589931Sam_a17Roller Coaster Railroad (IOI16_railroad)C++14
34 / 100
63 ms27192 KiB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
// #include "molecules.h"
#include <cstdio>
using namespace std;
#define ll long long

const int M = 16;
long long dp[1 << M][M];

long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
  int n = (int) s.size();

  memset(dp, -1, sizeof(dp));

  for(int i = 0; i < n; i++) {
    dp[1 << i][i] = 0;
  }

  for(int mask = 3; mask < 1 << n; mask++) {
    int cnt = 0;
    for(int i = 0; i < n; i++) {
      if(mask & (1 << i)) {
        cnt++;
      }
    }

    if(cnt == 1) {
      continue;
    }

    for(int i = 0; i < n; i++) {
      if(!(mask & (1 << i))) continue;
      for(int j = 0; j < n; j++) {
        if(!(mask & (1 << j)) || i == j) continue;
        // i -> j
        if(dp[mask][j] == -1) {
          if(t[i] <= s[j]) {
            dp[mask][j] = dp[mask ^ (1 << j)][i];
          } else {
            dp[mask][j] = dp[mask ^ (1 << j)][i] + t[i] - s[j];;
          }
        } else {
          if(t[i] <= s[j]) {
            dp[mask][j] = min(dp[mask][j], dp[mask ^ (1 << j)][i]);
          } else {
            dp[mask][j] = min(dp[mask][j], dp[mask ^ (1 << j)][i] + t[i] - s[j]);
          }
        }
      }
    }
  }

  long long answ = INT64_MAX;
  for(int i = 0; i < n; i++) {
    assert(dp[(1 << n) - 1][i] != -1);
    answ = min(answ, dp[(1 << n) - 1][i]);
  }

  return answ;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...