Submission #1283192

#TimeUsernameProblemLanguageResultExecution timeMemory
1283192abc123Train (APIO24_train)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

const long long INF = 1e15;

struct Train {
    int start_planet, end_planet, depart_time, arrive_time;
    long long cost;
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M, W;
    cin >> N >> M >> W;

    vector<int> T(N);
    for (int i = 0; i < N; ++i) cin >> T[i];

    vector<Train> trains(M);
    for (int i = 0; i < M; ++i) {
        cin >> trains[i].start_planet >> trains[i].end_planet
            >> trains[i].depart_time >> trains[i].arrive_time >> trains[i].cost;
    }

    vector<int> L(W), R(W);
    for (int i = 0; i < W; ++i) cin >> L[i] >> R[i];

    int max_time = 10; // per problem statement

    // DP[planet][time][mask] = min cost to be here after handling mask meals
    vector<vector<vector<long long>>> dp(N, vector<vector<long long>>(max_time + 1, vector<long long>(1 << W, INF)));
    dp[0][0][0] = 0;

    for (int time = 0; time <= max_time; ++time) {
        for (int planet = 0; planet < N; ++planet) {
            for (int mask = 0; mask < (1 << W); ++mask) {
                if (dp[planet][time][mask] == INF) continue;

                long long base_cost = dp[planet][time][mask];

                // Option 1: Take meals on planet at current time (pay cost)
                for (int meal = 0; meal < W; ++meal) {
                    if (((mask >> meal) & 1) == 0 && L[meal] <= time && time <= R[meal]) {
                        int new_mask = mask | (1 << meal);
                        long long cost_meal = base_cost + T[planet];
                        if (cost_meal < dp[planet][time][new_mask]) {
                            dp[planet][time][new_mask] = cost_meal;
                        }
                    }
                }

                // Option 2: Wait until next time on same planet without taking meal
                if (time < max_time && base_cost < dp[planet][time + 1][mask]) {
                    dp[planet][time + 1][mask] = base_cost;
                }

                // Option 3: Take any train leaving from planet at or after current time
                for (auto &train : trains) {
                    if (train.start_planet == planet && train.depart_time >= time) {
                        int covered_meals_mask = mask;
                        // Meals fully inside train time interval are free
                        for (int meal = 0; meal < W; ++meal) {
                            if (((covered_meals_mask >> meal) & 1) == 0) {
                                if (L[meal] >= train.depart_time && R[meal] <= train.arrive_time) {
                                    covered_meals_mask |= (1 << meal);
                                }
                            }
                        }
                        long long new_cost = base_cost + train.cost;
                        int arrivaltime = train.arrive_time;
                        int endplanet = train.end_planet;
                        if (new_cost < dp[endplanet][arrivaltime][covered_meals_mask]) {
                            dp[endplanet][arrivaltime][covered_meals_mask] = new_cost;
                        }
                    }
                }
            }
        }
    }

    long long answer = INF;
    for (int time = 0; time <= max_time; ++time) {
        answer = min(answer, dp[N - 1][time][(1 << W) - 1]);
    }

    if (answer == INF) cout << -1 << "\n";
    else cout << answer << "\n";

    return 0;
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccYVzM4I.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccAp02bj.o:train.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccYVzM4I.o: in function `main':
grader.cpp:(.text.startup+0x5ce): undefined reference to `solve(int, int, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status