Problem p01350 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <functional>
#include <set>
#include <vector>
#define scanf_s scanf
#define fir first
#define sec second
#define mp make_pair
#define mt make_tuple
#define pub push_back
using namespace std;
typedef long long int llint;
const llint one = 1;
const llint big = (one << 30);

int main(void) {
  int n, ans, i, j, k, ok;
  double r, sit;
  double x[20];
  double y[20];
  double dp[20][20] = {0}; // x??????y????????????
  double dpc[20][20] = {0};
  static bool isok[20][20][20];
  double d;
  double pi = 3.141592653589793238462643383279502884197;
  scanf("%d", &n);
  scanf("%lf %lf", &r, &sit);
  sit = (sit / 180) * pi;
  for (i = 0; i < n; i++) {
    scanf("%lf %lf", &x[i], &y[i]);
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      dp[i][j] = 0;
      dpc[i][j] = big;
    }
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      for (k = 0; k < n; k++) {
        d = abs(atan2(y[i] - y[k], x[i] - x[k]) -
                atan2(y[k] - y[j], x[k] - x[j]));
        isok[i][k][j] = (min(2 * pi - d, d) < sit);
      }
    }
  }
  for (ans = 0;; ans++) {
    for (k = 0; k < n; k++) {
      for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
          if (ans != 0 && (k - i) * (i - j) == 0) {
            continue;
          }
          if (j - k == 0) {
            continue;
          }
          if (ans == 0 && k != 0) {
            continue;
          }
          if (ans == 0 || isok[i][k][j]) {
            dpc[k][j] =
                min(dpc[k][j], dp[i][k] + hypot(x[k] - x[j], y[k] - y[j]));
          }
        }
      }
    }
    ok = 0;
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
        dp[i][j] = dpc[i][j];
        if (dpc[i][j] < r) {
          ok = 1;
        }
        dpc[i][j] = big;
      }
    }
    if (ok == 0) {
      break;
    }
  }

  printf("%d\\n", ans);
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <functional>
#include <vector>
#define scanf_s scanf
#define fir first
#define sec second
#define mp make_pair
#define mt make_tuple
#define pub push_back
using namespace std;
typedef long long int llint;
const llint one = 1;
const llint big = (one << 30);

int main(void) {
  int n, ans, i, j, k, ok;
  double r, sit;
  double x[20];
  double y[20];
  double dp[20][20] = {0}; // x??????y????????????
  double dpc[20][20] = {0};
  double d;
  double pi = 3.141592653589793238462643383279502884197;
  scanf("%d", &n);
  scanf("%lf %lf", &r, &sit);
  sit = (sit / 180) * pi;
  for (i = 0; i < n; i++) {
    scanf("%lf %lf", &x[i], &y[i]);
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      dp[i][j] = 0;
      dpc[i][j] = big;
    }
  }
  for (ans = 0;; ans++) {
    for (k = 0; k < n; k++) {
      for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
          if (ans != 0 && (k - i) * (i - j) == 0) {
            continue;
          }
          if (j - k == 0) {
            continue;
          }
          if (ans == 0 && k != 0) {
            continue;
          }
          d = abs(atan2(y[i] - y[k], x[i] - x[k]) -
                  atan2(y[k] - y[j], x[k] - x[j]));
          if (ans != 0 && min(2 * pi - d, d) > sit) {
            continue;
          }
          dpc[k][j] =
              min(dpc[k][j], dp[i][k] + hypot(x[k] - x[j], y[k] - y[j]));
        }
      }
    }
    ok = 0;
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
        dp[i][j] = dpc[i][j];
        if (dpc[i][j] < r) {
          ok = 1;
        }
        dpc[i][j] = big;
      }
    }
    if (ok == 0) {
      break;
    }
  }

  printf("%d\\n", ans);
  return 0;
}