結果
| 問題 |
No.2099 [Cherry Alpha B] Time Machine
|
| コンテスト | |
| ユーザー |
qwewe
|
| 提出日時 | 2025-05-14 13:14:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,972 bytes |
| コンパイル時間 | 893 ms |
| コンパイル使用メモリ | 91,076 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2025-05-14 13:15:25 |
| 合計ジャッジ時間 | 4,534 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 TLE * 1 -- * 68 |
ソースコード
#include <iostream>
#include <vector>
#include <queue>
#include <map>
// Define long long type alias for convenience, especially for large numbers
using ll = long long;
// Use a map to store minimum distances (costs) to visited days (states).
// Key: day (represented by long long), Value: minimum cost to reach this day (long long).
// A map is suitable here because the state space (days) can be very large and sparse.
// We only store entries for days that are actually reached.
std::map<ll, ll> dist;
int main() {
// Faster I/O operations by disabling synchronization with C standard streams
// and uncoupling cin/cout.
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
ll T; // Target day T. Can be positive or negative.
std::cin >> T;
ll X, A; // Action 2: Time machine forward. Costs X, moves +A days.
std::cin >> X >> A;
ll Y, B; // Action 3: Time machine backward. Costs Y, moves -B days.
std::cin >> Y >> B;
// Priority queue for Dijkstra's algorithm. Stores pairs {cost, day}.
// The priority queue is implemented as a min-heap using std::greater,
// so the element with the smallest cost has the highest priority.
std::priority_queue<std::pair<ll, ll>, std::vector<std::pair<ll, ll>>, std::greater<std::pair<ll, ll>>> pq;
// Initialize the distance to the starting day (day 0) as 0 cost.
dist[0] = 0;
// Push the starting state {cost=0, day=0} into the priority queue.
pq.push({0, 0});
// Main loop of Dijkstra's algorithm
while (!pq.empty()) {
// Extract the state (pair of cost and day) with the minimum cost from the priority queue.
std::pair<ll, ll> top = pq.top();
pq.pop();
ll cost = top.first; // Current minimum cost to reach current_day
ll current_day = top.second; // The day corresponding to this state
// If the extracted state corresponds to the target day T, we have found the shortest path.
// Print the minimum cost and exit the program successfully.
if (current_day == T) {
std::cout << cost << std::endl;
return 0;
}
// Optimization: If the cost extracted from the priority queue is greater than the already known
// shortest distance to current_day stored in the map, it means we found a shorter path to this day earlier.
// This state is outdated, so we skip processing it.
// It's important to check dist.count(current_day) first to ensure the key exists before accessing dist[current_day].
// This check prevents accessing a non-existent key which might insert a default value (0 for ll) incorrectly.
if (dist.count(current_day) && cost > dist[current_day]) {
continue;
}
// Explore neighbors (next possible states) based on the three possible actions:
// Action 1: Wait 1 day.
ll next_day1 = current_day + 1; // Move to the next day (day + 1)
ll cost1 = cost + 1; // The cost increases by 1 (experienced time)
// Check if next_day1 hasn't been visited yet (!dist.count(next_day1)) or if the new path
// through current_day offers a shorter cost (cost1 < dist[next_day1]).
if (!dist.count(next_day1) || cost1 < dist[next_day1]) {
dist[next_day1] = cost1; // Update or set the minimum distance to next_day1
pq.push({cost1, next_day1}); // Add the new state {cost1, next_day1} to the priority queue
}
// Action 2: Use time machine to travel A days into the future.
ll next_dayA = current_day + A; // Move A days forward (day + A)
ll costA = cost + X; // The cost increases by X
// Check if this path is shorter than any known path to next_dayA
if (!dist.count(next_dayA) || costA < dist[next_dayA]) {
dist[next_dayA] = costA; // Update or set the minimum distance
pq.push({costA, next_dayA}); // Add the new state to the priority queue
}
// Action 3: Use time machine to travel B days into the past.
ll next_dayB = current_day - B; // Move B days backward (day - B)
ll costB = cost + Y; // The cost increases by Y
// Check if this path is shorter than any known path to next_dayB
if (!dist.count(next_dayB) || costB < dist[next_dayB]) {
dist[next_dayB] = costB; // Update or set the minimum distance
pq.push({costB, next_dayB}); // Add the new state to the priority queue
}
}
// According to the problem statement, it is guaranteed that day T is always reachable.
// Therefore, the program should always find T and exit via the `return 0;` statement inside the loop.
// Reaching this point indicates an issue (e.g., T was somehow unreachable, or a bug in the logic).
return 1; // Return a non-zero value to indicate an error or unexpected termination condition
}
qwewe