#include int N, K; // pozície bodov na vstupe int pozicie[1000047]; // otestovať, či existuje riešenie // s minimálnou vzdialenosťou aspoň M bool existuje(int M, bool print) { int posledny = 0, vyhodene = 0; for (int i = 0; i < N; i++) { // ak sa dá pridať do riešenia, pridať if (posledny <= pozicie[i]) { posledny = pozicie[i]+M; } else { // inak preskočiť if (print) printf("%d\n", i+1); vyhodene++; } } // spĺňa riešenie kritérium ? return vyhodene <= K; } int main() { // načítať vstup scanf("%d %d", &N, &K); for (int i = 1; i < N; i++) { scanf("%d", &pozicie[i]); // prepočítať pozíciu bodu pozicie[i] += pozicie[i-1]; } // binárne nájsť riešenie na intervale int down = 0, up = pozicie[N-1]+1; while (up > down+1) { int median = (up+down)/2; // ak existuje riešenie pre medián, // potom riešenie je väčšie rovné if (existuje(median,false)) down = median; else // inak menšie up = median; } printf("Najmensia medzera je: %d\n", down); printf("Treba odstranit vrany:\n"); existuje(down,true); return 0; }