Submission #202628

#TimeUsernameProblemLanguageResultExecution timeMemory
202628SamAndCollecting Stamps 3 (JOI20_ho_t3)C++17
100 / 100
150 ms129576 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 202;
const long long INF = 1000000009000000009;

int n, L;
int x[N], t[N];

int ans;
long long dp[N][N][2][N];

int dist1(int x, int y)
{
    if (y <= x)
        return (x - y);
    return L - (y - x);
}

int dist2(int x, int y)
{
    if (y >= x)
        return (y - x);
    return L - (x - y);
}

int main()
{
    //freopen("input.txt", "r", stdin);
    scanf("%d%d", &n, &L);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &x[i]);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &t[i]);
    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            for (int z = 0; z < 2; ++z)
            {
                for (int k = 0; k < N; ++k)
                {
                    dp[i][j][z][k] = INF;
                }
            }
        }
    }
    dp[0][0][0][0] = dp[0][0][1][0] = 0;
    for (int i = 0; i <= n; ++i)
    {
        for (int j = 0; j <= n; ++j)
        {
            for (int z = 0; z < 2; ++z)
            {
                for (int k = 0; k <= n; ++k)
                {
                    if (dp[i][j][z][k] == INF)
                        continue;
                    ans = max(ans, k);
                    if (z == 0)
                    {
                        if (i + 1 + j <= n)
                        {
                            int v = (n - i + 1) % (n + 1);
                            int u = (n - (i + 1) + 1) % (n + 1);
                            if (dp[i][j][z][k] + dist1(x[v], x[u]) <= t[u])
                                dp[i + 1][j][z][k + 1] = min(dp[i + 1][j][z][k + 1], dp[i][j][z][k] + dist1(x[v], x[u]));
                            else
                                dp[i + 1][j][z][k] = min(dp[i + 1][j][z][k], dp[i][j][z][k] + dist1(x[v], x[u]));
                        }
                        if (i + j + 1 <= n)
                        {
                            int v = (n - i + 1) % (n + 1);
                            int u = j + 1;
                            if (dp[i][j][z][k] + dist2(x[v], x[u]) <= t[u])
                                dp[i][j + 1][(z ^ 1)][k + 1] = min(dp[i][j + 1][(z ^ 1)][k + 1], dp[i][j][z][k] + dist2(x[v], x[u]));
                            else
                                dp[i][j + 1][(z ^ 1)][k] = min(dp[i][j + 1][(z ^ 1)][k], dp[i][j][z][k] + dist2(x[v], x[u]));
                        }
                    }
                    else
                    {
                        if (i + j + 1 <= n)
                        {
                            int v = j;
                            int u = j + 1;
                            if (dp[i][j][z][k] + dist2(x[v], x[u]) <= t[u])
                                dp[i][j + 1][z][k + 1] = min(dp[i][j + 1][z][k + 1], dp[i][j][z][k] + dist2(x[v], x[u]));
                            else
                                dp[i][j + 1][z][k] = min(dp[i][j + 1][z][k], dp[i][j][z][k] + dist2(x[v], x[u]));
                        }
                        if (i + 1 + j <= n)
                        {
                            int v = j;
                            int u = (n - (i + 1) + 1) % (n + 1);
                            if (dp[i][j][z][k] + dist1(x[v], x[u]) <= t[u])
                                dp[i + 1][j][(z ^ 1)][k + 1] = min(dp[i + 1][j][(z ^ 1)][k + 1], dp[i][j][z][k] + dist1(x[v], x[u]));
                            else
                                dp[i + 1][j][(z ^ 1)][k] = min(dp[i + 1][j][(z ^ 1)][k], dp[i][j][z][k] + dist1(x[v], x[u]));
                        }
                    }
                }
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}

Compilation message (stderr)

ho_t3.cpp: In function 'int main()':
ho_t3.cpp:29:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &L);
     ~~~~~^~~~~~~~~~~~~~~~
ho_t3.cpp:31:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &x[i]);
         ~~~~~^~~~~~~~~~~~~
ho_t3.cpp:33:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &t[i]);
         ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...