Submission #1173464

#TimeUsernameProblemLanguageResultExecution timeMemory
1173464LucaIlieSemiexpress (JOI17_semiexpress)C++20
100 / 100
8 ms8772 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX_M = 3000;
const int MAX_K = 3000;

int s[MAX_M];
int optim[MAX_M][MAX_K];
int ind[MAX_M];

int main() {
    cin.tie( nullptr );
    ios_base::sync_with_stdio( false );
    
    int n, m, k;
    int a, b, c;
    long long t;
        
    cin >> n >> m >> k;
    cin >> a >> b >> c;
    cin >> t;
    for ( int i = 0; i < m; i++ ) {
        cin >> s[i];
        s[i]--;
    }

    for ( int i = 0; i < m - 1; i++ ) {
        long long timePassed = (long long)b * s[i];
        int stationC = s[i];
        int nrStations = 0;
        while ( nrStations <= k - m && stationC < s[i + 1] && timePassed <= t ) {
            int reachByA = min( (long long)s[i + 1] - 1, stationC + (t - timePassed) / a );
            optim[i][nrStations] = reachByA - stationC + 1;

            timePassed += (long long)c * (reachByA + 1 - stationC);
            stationC = reachByA + 1;
            nrStations++;
       }
    }

    /*for ( int i = 0; i < m - 1; i++ ) {
        for ( int j = 0; j < k; j++ )
            printf( "%d ", optim[i][j] );
        printf( "\n" );
    }*/

    int countReachable = ((long long)b * (n - 1) <= t);
    for ( int i = 0; i < m - 1; i++ ) {
        countReachable += optim[i][0];
        ind[i] = 1;
    }
    k -= m;
    for ( int i = 0; i < k; i++ ) {
        int k = 0;
        for ( int j = 1; j < m - 1; j++ ) {
            if ( optim[j][ind[j]] > optim[k][ind[k]] )
                k = j;
        }
        countReachable += optim[k][ind[k]];
        ind[k]++;
    }

    cout << countReachable - 1 << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...