#include int Vyhra(int v, int h) { return v * 100000 / h; } int main() { // čtení vstupu a inicializace int N, K; scanf("%d%d", &N, &K); // pole chceme logicky číslovat od jedničky int Zisk[K + 1][N + 1], Vyrazeno[K + 1][N + 1]; for (int n = 1; n <= N; n++) { Zisk[1][n] = Vyhra(n - 1, n); Vyrazeno[1][n] = n - 1; } // vyplnění tabulky; kola se číslují od konce hry for (int k = 2; k <= K; k++) { // počítá maximální zisk, s využitím známého konce hry for (int n = 1; n <= N; n++) { int max = 0; int argmax = 0; for (int v = 0; v <= n - 1; v++) { int body = Zisk[k - 1][n - v] + Vyhra(v, n); // ostrá nerovnost funguje, preferuje // kola bez vyřazení na začátku soutěže if (body >= max) { max = body; argmax = v; } } Zisk[k][n] = max; Vyrazeno[k][n] = argmax; } } // výstup for (int k = K, n = N; k >= 1; k--) { int v = Vyrazeno[k][n]; printf("%d ", v); n -= v; } printf("\n"); return 0; }