#include #include using namespace std; // Usnadníme si psaní long longu. typedef unsigned long long int ll; int H, L; vector lehatka; // Ověř, že umíme hrochy rozmístit se zadanou minimální vzdáleností. // Funkci použijeme i k vypisování výstupu - proto když `vypisuj` je true, // funkce vypíše na standardní výstup vybrané pozice hrochů. bool over(ll vzdalenost, bool vypisuj) { // První hroch určitě může ležet na prvním (nultém) lehátku. int predchoziIndex = 0; if (vypisuj) { cout << 0 << endl; } // Každému hrochovi zkusíme najít lehátko na nejnižším možném indexu. for (int i = 1; i < H; ++i) { if (lehatka[L-1] - lehatka[predchoziIndex] < vzdalenost) { // Došla nám lehátka. return false; } // Binární vyhledávání pozice: int dolniMez = predchoziIndex + 1; int horniMez = L - 1; while (horniMez > dolniMez) { int stred = (dolniMez + horniMez) / 2; if (lehatka[stred] - lehatka[predchoziIndex] < vzdalenost) { dolniMez = stred + 1; } else { horniMez = stred; } } // `dolniMez` teď obsahuje nalezený index lehátka predchoziIndex = dolniMez; if (vypisuj) { cout << dolniMez << endl; } } // Podařilo se umístit všechny hrochy. return true; } int main() { // Načti vstup cin >> H >> L; lehatka.resize(L); for (int i = 0; i < L; ++i) { cin >> lehatka[i]; } // Binárně vyhledáme optimální vzdálenost mezi hrochy. ll dolniMez = 0; ll horniMez = lehatka[L-1] - lehatka[0]; while (horniMez > dolniMez) { ll stred = (dolniMez + horniMez) / 2 + 1; if (over(stred, false)) { dolniMez = stred; } else { horniMez = stred - 1; } } cout << dolniMez << endl; // Víme, že `dolniMez` stačí k umístění všech hrochů, tak jen necháme // funkci `over` vypsat příslušné indexy. over(dolniMez, true); return 0; }