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

#include <bits/stdc++.h>
#define ll long long
#define INF 1000000005
#define MOD 1000000007
#define EPS 1e-10
#define rep(i, n) for (int i = 0; i < (int)n; ++i)

using namespace std;

typedef pair<int, int> P;

const int MAX_N = 100005;

int x[21], y[21];
double d[21][21];
double dp[10001][21][21];

double dir(int i, int j) {
  return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}

double ang(int i, int j, int k) {
  double dott = (x[j] - x[i]) * (x[k] - x[j]) + (y[j] - y[i]) * (y[k] - y[j]);
  double cs = dott / d[i][j] / d[j][k];
  return acos(cs);
}

int main() {
  int n;
  double r, th;
  scanf("%d", &n);
  scanf("%lf%lf", &r, &th);
  rep(i, n) { scanf("%d%d", &x[i], &y[i]); }
  rep(i, n) {
    rep(j, n) { d[i][j] = dir(i, j); }
  }
  rep(i, 10001) {
    rep(j, n) {
      rep(k, n) { dp[i][j][k] = INF; }
    }
  }
  bool hoge = false;
  rep(i, n - 1) {
    if (d[0][i + 1] < r + EPS) {
      dp[1][0][i + 1] = d[0][i + 1];
      hoge = true;
    }
  }
  if (!hoge) {
    printf("0\\n");
    return 0;
  }
  vector<int> vec[21][21];
  rep(i, n) {
    rep(j, n) {
      if (j != i) {
        rep(k, n) {
          if (ang(i, j, k) * 180.0 / M_PI < th + EPS) {
            vec[i][j].push_back(k);
          }
        }
      }
    }
  }
  int res;
  rep(i, 10000) {
    bool flag = false;
    rep(j, n) {
      rep(k, n) {
        if (k != j) {
          rep(l, vec[j][k].size()) {
            if (dp[i + 1][j][k] + d[k][vec[j][k][l]] < r + EPS) {
              dp[i + 2][k][vec[j][k][l]] =
                  min(dp[i + 2][k][vec[j][k][l]],
                      dp[i + 1][j][k] + d[k][vec[j][k][l]]);
              flag = true;
            }
          }
        }
      }
    }
    if (!flag) {
      res = i + 1;
      break;
    }
  }
  printf("%d\\n", res);
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define ll long long
#define INF 1000000005
#define MOD 1000000007
#define EPS 1e-10
#define rep(i, n) for (int i = 0; i < (int)n; ++i)

using namespace std;

typedef pair<int, int> P;

const int MAX_N = 100005;

int x[21], y[21];
double d[21][21];
double dp[10001][21][21];

double dir(int i, int j) {
  return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}

double ang(int i, int j, int k) {
  double dott = (x[j] - x[i]) * (x[k] - x[j]) + (y[j] - y[i]) * (y[k] - y[j]);
  double cs = dott / d[i][j] / d[j][k];
  return acos(cs);
}

int main() {
  int n;
  double r, th;
  scanf("%d", &n);
  scanf("%lf%lf", &r, &th);
  rep(i, n) { scanf("%d%d", &x[i], &y[i]); }
  rep(i, n) {
    rep(j, n) { d[i][j] = dir(i, j); }
  }
  rep(i, 10001) {
    rep(j, n) {
      rep(k, n) { dp[i][j][k] = INF; }
    }
  }
  bool hoge = false;
  rep(i, n - 1) {
    if (d[0][i + 1] < r + EPS) {
      dp[1][0][i + 1] = d[0][i + 1];
      hoge = true;
    }
  }
  if (!hoge) {
    printf("0\\n");
    return 0;
  }
  int res;
  rep(i, 10000) {
    bool flag = false;
    rep(j, n) {
      rep(k, n) {
        if (k != j) {
          rep(l, n) {
            if (ang(j, k, l) * 180.0 / M_PI < th + EPS) {
              if (dp[i + 1][j][k] + d[k][l] < r + EPS) {
                dp[i + 2][k][l] =
                    min(dp[i + 2][k][l], dp[i + 1][j][k] + d[k][l]);
                flag = true;
              }
            }
          }
        }
      }
    }
    if (!flag) {
      res = i + 1;
      break;
    }
  }
  printf("%d\\n", res);
  return 0;
}