#include #include uint32_t round_ct(uint32_t cents) { switch (cents % 5) { case 0: return cents; case 1: return cents - 1; case 2: return cents - 2; case 3: return cents + 2; case 4: return cents + 1; } } int32_t maximum_profit(uint16_t products[], uint16_t n_products, uint8_t dividers) { int32_t profit[n_products+1][dividers+1]; uint16_t p, d; for (p = 0; p <= n_products; p++) { uint32_t sums[p]; if (p == 0) { sums[0] = 0; } else { int16_t i; for (i = p-1; i >= 0; i--) { if (i == p-1) sums[i] = products[i]; else sums[i] = products[i] + sums[i+1]; } } for (d = 0; d <= dividers; d++) { if (p == 0) { profit[p][d] = 0; } else if (d == 0) { profit[p][d] = sums[0] - round_ct(sums[0]); } else { int32_t max = profit[p][d-1]; uint16_t i; for (i = 0; i < p; i++) { int32_t try = profit[i][d-1] + sums[i] - round_ct(sums[i]); if (try > max) max = try; } profit[p][d] = max; } } } return profit[n_products][dividers]; } int main(void) { int n_products; int dividers; uint32_t sum = 0; scanf("%d %d", &n_products, ÷rs); uint16_t products[n_products]; uint16_t i; for (i = 0; i < n_products; i++) { scanf("%d", &(products[i])); sum += products[i]; if (products[i] % 5 == 0) { n_products--; i--; } } printf("%d\n", sum - maximum_profit(products, n_products, dividers)); }