Submission #777456

#TimeUsernameProblemLanguageResultExecution timeMemory
777456boris_mihovBoxes with souvenirs (IOI15_boxes)C++17
10 / 100
0 ms212 KiB
#include "boxes.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>

typedef long long llong;
const int MAXN = 10000000 + 10;
const int INF  = 1e9;

int n, k, l;
std::vector <int> left;
std::vector <int> right;

llong delivery(int N, int K, int L, int p[]) 
{
    n = N;
    k = K;
    l = L;

    for (int i = 0 ; i < n ; ++i)
    {
        if (p[i] <= l - p[i]) left.push_back(p[i]);
        else right.push_back(p[i]);
    }

    int carrying = 0;
    llong ans = 0;
    bool shouldAdd = false;
    std::reverse(right.begin(), right.end());

    for (int i = 0 ; i < left.size() ; i += k)
    {
        if (i + k - 1 < left.size())
        {
            ans += 2 * left[i + k - 1];
        } else
        {
            shouldAdd = true;
            ans += left.back();
            carrying = k - (left.size() - i);
        }
    }

    llong ans1 = ans;
    std::vector <int> rightCpy = right;
    for (int i = 0 ; i < carrying && rightCpy.size() ; ++i)
    {
        rightCpy.pop_back();
    }

    if (shouldAdd) ans1 += l - left.back();
    for (int i = 0 ; i < rightCpy.size() ; i += k)
    {
        if (i + k - 1 < rightCpy.size())
        {
            ans1 += 2 * (l - rightCpy[i + k - 1]);
        } else
        {
            ans1 += 2 * (l - rightCpy.back());
        }
    }

    if (shouldAdd) ans += left.back();
    for (int i = 0 ; i < right.size() ; ++i)
    {
        if (i + k - 1 < right.size())
        {
            ans += 2 * (l - right[i + k - 1]);
        } else
        {
            ans += 2 * (l - right.back());
        }
    }

    assert(k != n || !shouldAdd || ans1 == l);
    return std::min(ans, ans1);
}

Compilation message (stderr)

boxes.cpp: In function 'llong delivery(int, int, int, int*)':
boxes.cpp:33:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |     for (int i = 0 ; i < left.size() ; i += k)
      |                      ~~^~~~~~~~~~~~~
boxes.cpp:35:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |         if (i + k - 1 < left.size())
      |             ~~~~~~~~~~^~~~~~~~~~~~~
boxes.cpp:42:26: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   42 |             carrying = k - (left.size() - i);
      |                        ~~^~~~~~~~~~~~~~~~~~~
boxes.cpp:54:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |     for (int i = 0 ; i < rightCpy.size() ; i += k)
      |                      ~~^~~~~~~~~~~~~~~~~
boxes.cpp:56:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         if (i + k - 1 < rightCpy.size())
      |             ~~~~~~~~~~^~~~~~~~~~~~~~~~~
boxes.cpp:66:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |     for (int i = 0 ; i < right.size() ; ++i)
      |                      ~~^~~~~~~~~~~~~~
boxes.cpp:68:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         if (i + k - 1 < right.size())
      |             ~~~~~~~~~~^~~~~~~~~~~~~~
#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...