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

#include <algorithm>
#include <cassert>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <vector>
#define REP(i, s, n) for (int i = s; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define MAX 101
#define inf (1 << 29)
using namespace std;
int a[MAX];
int A[10001];
int n;
double b, r, v, e, f;
double mincost[MAX][10001];

struct P {
  int last;
  double x, cost, now;
  P(double now = -1, double x = -1, double cost = -1, int last = -1)
      : now(now), x(x), cost(cost), last(last) {}
  bool operator<(const P &a) const { return cost >= a.cost; }
};

double getCost(double x) {
  if (x >= r)
    return 1.0 / (v - e * (x - r));
  return 1.0 / (v - f * (r - x));
}

void dijkstra() {
  double ans = inf;
  rep(i, n) rep(j, 10001) mincost[i][j] = inf;
  mincost[0][0] = 0;

  priority_queue<P> Q;
  Q.push(P(0, 0, 0, 0));

  while (!Q.empty()) {
    P p = Q.top();
    Q.pop();
    if (p.now >= a[n - 1]) {
      ans = min(ans, p.cost);
      continue;
    }

    if (ans <= p.cost)
      continue;

    assert(0 <= p.cost);
    double ncost = p.cost + getCost(p.x);
    assert(0 <= ncost);

    if (mincost[p.last][(int)p.now + 1] > ncost) {
      mincost[p.last][(int)p.now + 1] = ncost;
      Q.push(P(p.now + 1, p.x + 1, ncost, p.last));
    }

    if (A[(int)p.now + 1] != -1) {
      double change_cost = (A[(int)p.now + 1] == n ? 0 : b);
      ncost += change_cost;
      Q.push(P(p.now + 1, 0, ncost, A[(int)p.now + 1]));
    }
  }

  cout << setiosflags(ios::fixed) << setprecision(4) << ans << endl;
}

int main() {
  while (cin >> n, n) {
    rep(i, 10001) A[i] = -1;
    rep(i, n) {
      cin >> a[i];
      A[a[i]] = i + 1;
    }
    cin >> b >> r >> v >> e >> f;

    dijkstra();
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <vector>
#define REP(i, s, n) for (int i = s; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define MAX 101
#define inf (1 << 29)
using namespace std;
int a[MAX];
int A[10001];
int n;
double b, r, v, e, f;
double mincost[MAX][10001];

struct P {
  int last;
  double x, cost, now;
  P(double now = -1, double x = -1, double cost = -1, int last = -1)
      : now(now), x(x), cost(cost), last(last) {}
  bool operator<(const P &a) const { return cost < a.cost; }
};

double getCost(double x) {
  if (x >= r)
    return 1.0 / (v - e * (x - r));
  return 1.0 / (v - f * (r - x));
}

void dijkstra() {
  rep(i, n) rep(j, 10001) mincost[i][j] = inf;
  mincost[0][0] = 0;

  priority_queue<P> Q;
  Q.push(P(0, 0, 0, 0));

  while (!Q.empty()) {
    P p = Q.top();
    Q.pop();

    if (p.now >= a[n - 1])
      continue;

    double ncost = p.cost + getCost((int)p.x); //+1

    if (mincost[p.last][(int)p.now + 1] > ncost) {
      mincost[p.last][(int)p.now + 1] = ncost;
      Q.push(P(p.now + 1, p.x + 1, ncost, p.last));
    }

    if (A[(int)p.now + 1] != -1) {
      double change_cost = (A[(int)p.now + 1] == n - 1 ? 0 : b);
      ncost = ncost + change_cost;
      Q.push(P(p.now + 1, 0, ncost, A[(int)p.now + 1]));
    }
  }
  double ans = inf;
  rep(i, n) ans = min(ans, mincost[i][a[n - 1]]);
  cout << setiosflags(ios::fixed) << setprecision(4) << ans << endl;
}

int main() {
  while (cin >> n, n) {
    rep(i, 10001) A[i] = -1;
    rep(i, n) {
      cin >> a[i];
      A[a[i]] = i;
    }
    cin >> b >> r >> v >> e >> f;

    dijkstra();
  }
  return 0;
}

/*


テ」ツ??」ツ??」ツ??」ツ??
テ」ツ??,-テッツスツ、テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??.-テッツスツ、
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??./:::::テッツシツシテ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テッツシツ?:::::テ」ツδス
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??::::::::::::;テ」ツつ?-テ「ツ板?「ツ板?-
テッツスツ、._/::::::::::::::|
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??/,.-テ「ツ??'"テつエ
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テッツシツシ:::::::::::|
テ」ツ??」ツ??」ツ??」ツ??」ツ??ッツシツ湘」ツ??テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツδステッツスツ、::::|
テ」ツ??」ツ??」ツ??」ツ??テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツδス|
テ」ツ??」ツ??テ」ツ??lテ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??l
テ」ツ??」ツ??」ツ??.|テ」ツ??」ツ??」ツ??テ「ツ猟湘」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テ」ツ??」ツ??」ツ??」ツ??」ツつ禿」ツδシテ」ツ?ィテ」ツ?ュテ」ツδサテ」ツδサ
テ」ツ??テ」ツ??テ」ツ??テ」ツ??」ツ?? ,
,テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??「ツ猟湘」ツ??」ツ??」ツ??」ツ??l
テ」ツ??」ツ??」ツ??」ツ??
テッツスツ、テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??_テ、ツコツコ__テ、ツクツソテ」ツ??」ツ??」ツ??」ツ??ッツスツ、テッツスツ、テッツスツ、
テ」ツ??/テ」ツ?? テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テッツスツー
テッツスツ、__テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テ」ツ??テ」ツ??テッツシツ?
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??`'''テッツスツーテ「ツ?静「ツ?静「ツ板?「ツ板?「ツ?静「ツ?静「ツ?静「ツ板ャ'''""テつエ
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??,-テッツスツ、テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??.-テッツスツ、
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??./:::::テッツシツシテ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テッツシツ?:::::テ」ツδス
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??::::::::::::;テ」ツつ?-テ「ツ板?「ツ板?-
テッツスツ、._/::::::::::::::|
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??/,.-テ「ツ??'"テつエ
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テッツシツシ:::::::::::|
テ」ツ??」ツ??」ツ??」ツ??」ツ??ッツシツ湘」ツ??テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツδステッツスツ、::::|
テ」ツ??」ツ??」ツ??」ツ??テ」ツ??」ツ??」ツ??」ツ??「ツ猟湘」ツ??」ツ??」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツδス|
テ」ツ??」ツ??テ」ツ??lテ」ツ??」ツ??」ツ?? ,
,テ」ツ??」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ「ツ猟湘」ツ??」ツ??」ツ??テ」ツ??l
テ」ツ??」ツ??」ツ??.|テ」ツ??」ツ??」ツ??テ」ツ??」ツ??」ツ??」ツ??_テ、ツコツコ__テ、ツクツソテ」ツ??」ツ??」ツ??」ツ??」ツ??ッツスツ、テッツスツ、テッツスツ、テ」ツ??」ツ??テ」ツ??」ツ??」ツ??」ツ??」ツつ湘」ツ?凝」ツつ禿」ツ?ェテ」ツ??
テ」ツ??テ」ツ??テ」ツ??テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テ」ツ??l
テ」ツ??」ツ??」ツ??」ツ??
テッツスツ、テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??テ」ツ??/
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??テッツスツー
テッツスツ、__テ」ツ??」ツ??」ツ??テ」ツ??テ」ツ??テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??ッツシツ?
テ」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??」ツ??`'''テッツスツーテ「ツ?静「ツ?静「ツ板?「ツ板?「ツ?静「ツ?静「ツ?静「ツ板ャ'''""テつエ


 */