#include #include #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wreturn-type" int8_t round_profit(uint32_t value) { switch (value % 5) { case 0: return 0; case 1: return 1; case 2: return 2; case 3: return -2; case 4: return -1; } } #pragma GCC diagnostic pop int32_t maximum_profit(int seq[], uint16_t seq_len, uint8_t k) { int8_t gain[seq_len+1][k+1]; uint16_t p, d, i; for (p = 0; p <= seq_len; p++) { uint32_t sum[p]; if (p == 0) { sum[0] = 0; } else { sum[p-1] = seq[p-1]; for (i = p-2; i != UINT16_MAX; i--) sum[i] = seq[i] + sum[i+1]; } for (d = 0; d <= k; d++) { if (p == 0) { gain[p][d] = 0; } else if (d == 0) { gain[p][d] = round_profit(sum[0]); } else { int8_t max = gain[p][d-1]; for (i = 0; i < p; i++) { int8_t try = gain[i][d-1] + round_profit(sum[i]); if (try > max) max = try; } gain[p][d] = max; } } } return gain[seq_len][k]; } int main(void) { int seq_len, k; uint32_t sum = 0; scanf("%d %d", &seq_len, &k); int seq[seq_len]; uint16_t i; for (i = 0; i < seq_len; i++) { scanf("%d", &(seq[i])); sum += seq[i]; if (seq[i] % 5 == 0) { seq_len--; i--; } } printf("%d\n", sum - maximum_profit(seq, seq_len, k)); }