#include #ifdef BUG #include "debug.hpp" #else #define DEBUG(var) #endif using namespace std; template< class T1, class T2 > inline istream & operator>>( istream & fin, pair< T1, T2 > & pr ) { fin >> pr.first >> pr.second; return fin; } template< class T0, class T1, class T2 > inline istream & operator>>( istream & fin, tuple< T0, T1, T2 > & t ) { fin >> get<0>(t) >> get<1>(t) >> get<2>(t); return fin; } template< class T > inline istream & operator>>( istream & fin, vector< T > & a ) { for(auto & u: a) fin >> u; return fin; } template inline istream & operator>>( istream & fin, array & a ) { for(auto & u: a) fin >> u; return fin; } template inline auto dump(FwdIter first, FwdIter last, const char * dlm = " ") -> void { typedef typename iterator_traits::value_type value_type; copy(first, last, ostream_iterator(cout, dlm)); } template vector & operator--(vector & a) { for(auto & i: a) --i; return a; } /* @@@ ----------------------------------- */ int64_t turn_off_the_lights() { size_t n, k; cin >> n >> k; vector c(n); cin >> c; const int64_t inf = numeric_limits::max() >> 2; vector left(n, inf), right(n, inf); for(size_t i = 0; i < n; ++i) { const size_t l = i < k ? 0 : i - k; const size_t r = min(i + k, n - 1); left[r] = min(left[r], c[i] + (l ? left[l - 1] : 0)); } for(size_t i = n - 1; i < n; --i) { const size_t l = i < k ? 0 : i - k; const size_t r = min(i + k, n - 1); right[l] = min(right[l], c[i] + (r != n - 1 ? right[r + 1] : 0)); } DEBUG(left); DEBUG(right); int64_t out = min(left.back(), right.front()); for(size_t i = 0; i + 1 < n; ++ i) out = min(out, left[i] + right[i + 1]); return out; } int main(const int argc, char * argv []) { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cout << turn_off_the_lights(); return EXIT_SUCCESS; }