Подела јабука
Аутор: Милош Милутиновић
Текст и тест примери: Милош Милутиновић
Тестирање: Драган Урошевић
Анализа решења: Василије Новаковић
Решење када a,b,c \le 200.
На почетку, Дон Хуан има a јабука, Селектор има b јабука, а Варијације има c јабука.
Назовимо процес у ком један пријатељ подигне руку и добије јабуке његовом операцијом.
Приметимо да редослед операција није битан, јер ће сваки пријатељ након неких операција имати
k = x + 2 \cdot y - z, где је:
k: број јабука које неки пријатељ има након неких операција,
x: број јабука које је имао пре операција,
y: број сопствених операција,
z: број туђих операција.
k очигледно не зависи од редоследа операција, јер ништа у једначини не зависи од редоследа операција.
Још једна ствар коју можемо приметити јесте да ако сваки пријатељ сазове по једну операцију, то је исто као да је нико није сазвао. Ово значи да ако постоји начин да сва тројица имају једнак број јабука на крају, могуће је то одрадити тако да само двојица раде операције.
Пошто је сопствена операција једини начин да се сопствени број јабука повећа, очигледно је да ће два пријатеља са најмањим бројем јабука једини извршавати операције.
Претпоставимо да a \le b \le c, ако није можемо их само заменити тако да ова неједнакост важи.
Сад, ако прво радимо операције да повећамо b, па онда да повећамо a, очигледно након операција на b, b и c морају да буду једнаки, јер ће након тога операције на a смањивати оба броја подједнако.
Можемо симулирати операције на b све док не буде важило b \ge c. Ако b > c очигледно је одговор НЕ, јер ће операцијама на a оба подједнако да се смање, па никад неће бити једнаки.
Ако b = c, симулирамо операције на a, све док не буде важило a \ge b, то јест a \ge c.
Сад, из истог разлога, ако је a > b одговор је НЕ, а ако је a = b = c, одговор је очигледно ДА.
Једном операцијом, смањићемо разлику између бројева за 3, па је највећи могући број операција a+b.
Временска сложеност: O(a+b).
Просторна сложеност: O(1).
Главно решење
Приметимо да процес који смо раније радили не морамо да симулирамо, већ можемо брже да израчунамо.
Наиме, изједначавање b и c ће се десити ако и само ако је c - b дељиво са 3, јер једна операција повећава b за 2, а смањује c за 1.
Ако није дељиво са 3, очигледно ће одговор бити НЕ.
Ако јесте, можемо закључити да ћемо урадити (c-b)/3 операција на b. Њих можемо све одједном применити тако што одузмемо (c-b)/3 од a и c, а додамо 2 \cdot (c-b)/3 на b.
Сад важи b = c, и свака операција на a ће смањити b и c подједнако. Исто као за b и c, морамо да проверимо да ли је b-a дељиво са 3. Ако јесте, не морамо ни да радимо операције, јер знамо да ће их оне изједначити, па да је одговор ДА, ако није, одговор је НЕ.
Ово решење је довољно да код прође, али можемо га учинити још једноставнијим.
Наиме, резултат операције на a је: a постаје a+2, b постаје b-1, c постаје c-1.
Приметимо да се међусобне разлике између свака два елемента остале исте по модулу 3.
Такође приметимо из претходно наведеног процеса, да нам је одговор НЕ, само ако у неком тренутку разлика између нека два елемента није дељива са 3.
Ово нас доводи до закључка да разлика свака два елемента мора бити дељива са 3 на почетку јер се то операцијама не мења.
Ако јесте, показали смо како се решење добија, али довољно је само исписати ДА.
Ако није, показали смо да је немогуће добити решење, тако да се исписује НЕ.
Временска и просторна сложеност: O(1).