Одбијање
Аутор: Андреј Ивашковић
Текст и тест примери: Димитрије Ердељан
Тестирање: Андреј Ивашковић
Анализа решења: Андреј Ивашковић
Решење за 30 поена
Довољна је проста симулација овог кретања: док год куглица има апсолутну вредност своје позиције не већу од 100, свака секунда кретања се симулира. Води се рачуна о тренутној позицији x, времену од почетка t, брзини \mathit{dx} (која је или 1 или -1) и тренутку најскоријег судара T. У сваком кораку се ажурира позиција (x := x + \mathit{dx}) и провери да ли позиција одговара некој од препрека – а у том случају се ажурирају отпорност препреке, брзина и време најскоријег судара. Ово решење даје тачан одговор у временској сложености O(N \cdot \max_i S_i \cdot \max_i |X_i|).
Решење за 50 поена
Реч је о једноставној оптимизација претходног приступа. Уместо да се у сваком кораку позиција промени за 1, довољно је водити рачуна о наредној удареној препреци са леве и са десне стране. Време између два судара је тада једнако апсолутној вредности разлике између позиција те две препреке. Најпре треба поделити препреке у два низа: препреке са негативном позицијом и препреке са позитивном позицијом. У та два низа се затим одреде препреке најближе куглици и врши се симулација кретања. Када отпорност неке препреке постане једнака нули, тада се та препрека означи као непостојећа и бира се најближа препрека са ненултом отпорности. Временска сложеност овог приступа је O(N \cdot \max_i S_i \cdot \max_i |X_i|).
Решења за 70 и 100 поена
Ова два решења су малтене идентична и разликују се по томе што користе различите алгоритме сортирања: O(N^2) временске сложености и O(N \log N) временске сложености. Најпре се, као у претходном решењу, раздвоје низови препрека лево од нуле и препрека десно од нуле. Затим се ти низови сортирају по апсолутној вредности позиције и тако се одређује редослед којим се куглица судара са препрекама. Да ли је последње одбијање са неким левим зидом или десним зидом се одређује поређењем укупних отпорности десних зидова и левих зидова:
- ако је укупна отпорност десних зидова r мања или једнака укупној отпорности левих l, тада са леве стране имамо l одбијања, а са десне l+1 одбијање;
- у супротном, са леве стране и десне стране имамо по r одбијања.
На основу укупног броја одбијања са обе стране је могуће одредити за сваку “деоницу” (простор између две узастопне препреке) колико је пута пређена. На пример, ако је дошло до m одбијања са леве стране, тада је прва деоница (од 0 до првог зида) пређена 2m пута, друга 2(m-\mathit{otp\_levih}[0]) пута итд, докле год преостали број одбијања не постане негативан. Неопходно је посветити пажњу последњем судару и одузети 1 од броја прелазака последње деонице.