Submission #65206

#TimeUsernameProblemLanguageResultExecution timeMemory
65206daniel_02Boxes with souvenirs (IOI15_boxes)C++17
50 / 100
2060 ms4284 KiB
#include "boxes.h"
#include <bits/stdc++.h>

using namespace std;

long long delivery(int N, int K, int L, int p[]) {

    long long ans = 0;

    if (K == 1)
    {
        for (int i = 0; i < N; i++)
        {
            if (p[i] <= L / 2)
            {
                ans += (p[i] * 2LL);
            }
            else
            {
                ans += ((L - p[i]) * 2LL);
            }
        }
    }
    else if (K == N)
    {
        bool l = 0, r = 0;

        for (int i = 0; i < N; i++)
        {
            if (p[i] <= L / 2)
            {
                l = 1;
            }
            else
            {
                r = 1;
            }
        }

        if (l == 1 && r == 0)
        {
            return (p[N - 1] * 2);
        }
        else if (r == 1 && l == 0)
        {
            return ((L - p[0]) * 2);
        }

        ans = L;

        long long cur = 0;

        for (int i = 0; i < N; i++)
        {
            if (p[i] > L / 2)
            {
                cur += (p[i - 1] * 2);
                break;
            }
        }

        for (int i = N - 1; i >= 0; i--)
        {
            if (p[i] <= L / 2)
            {
                cur += ((L - p[i + 1]) * 2);
                break;
            }
        }

        ans = min(ans, cur);

    }
    else
    {
        ans = 1LL * 1e18 + 7;

        for (int i = 0; i < N; i++)
        {
            long long cur = 0;

            for (int j = i; j >= 0; j -= K)
            {
                if (p[j] <= L / 2)
                    cur += (p[j] * 2);
                else
                {
                    if (j - K + 1 >= 0)
                    {
                        cur += min((L - p[j - K + 1]) * 2, L);
                    }
                    else
                    {
                        if (p[0] > L / 2)
                            cur += min((L - p[0]) * 2, L);
                        else
                            cur += L;
                    }
                }
            }

            for (int j = i + 1; j < N; j += K)
            {
                if (p[j] > L / 2)
                {
                    cur += ((L - p[j]) * 2);
                }
                else
                {
                    if (j + K - 1 < N)
                    {
                        cur += min(p[j + K - 1] * 2, L);
                    }
                    else
                    {
                        if (p[N - 1] <= L / 2)
                            cur += min(p[N - 1] * 2, L);
                        else
                            cur += L;
                    }
                }
            }
            ans = min(ans, cur);
        }
    }

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