Зважування#1993

Зважування (Розбір)

Розіб'ємо всі кулі на три групи, по можливості однакові за кількістю. Якщо число не ділиться на , то розміри груп відрізнятимуться не більше ніж на одну кулю. Дві групи однакового розміру покладемо на шальки терезів. В результаті одного зважування ми визначимо, в якій з трьох груп знаходиться важка куля.

Таким чином, за одне зважування задача з кулями у найгіршому випадку зводиться до задачі з кулями. Отже, для гарантованого виявлення важкої кулі достатньо ⌈log_3n⌉ зважувань.

Друге рішення. Нехай — найбільший степінь, для якої виконується нерівність 3^p < n. Тоді мінімальна кількість зважувань, необхідна для гарантованого виявлення важкої кулі, дорівнює p + 1.

Приклад

Для трьох куль достатньо одного зважування. Якщо шальки терезів знаходяться у рівновазі, то більш важка куля не була поміщена на терези.

У випадку куль розіб'ємо їх на групи по кулі. Помістивши по одній групі на кожну шальку терезів, за одне зважування ми визначимо, в якій групі знаходиться важка куля.

Якщо ж є куль, розіб'ємо їх на три групи наступним чином: і кулі. При цьому на шальки терезів покладемо дві групи по кулі.

Реалізація алгоритму

Читаємо кількість кульок .

scanf("%d",&n);

Вичисляємо і виводимо відповідь.

res = ceil(log(n) / log(3));
printf("%.0lf\n",res);  

Реалізація алгоритму – циклічна

Читаємо кількість кульок .

scanf("%d",&n); 

Вичисляємо і виводимо відповідь.

res = 0; p = 1;
while (p < n)
{
  p = p * 3;
  res++;
}

printf("%d\n",res);  

Java реалізація

import java.util.*;

public class Main
{
  public static void main(String []args)
  {
    Scanner con = new Scanner(System.in);
    int n = con.nextInt();   
    double res = Math.ceil(Math.log(n) / Math.log(3));
    System.out.printf("%.0f\n",res);
    con.close();
  }
}    

Python реалізація

Читаємо кількість кульок .

n = int(input())

Вичисляємо і виводимо відповідь.

print(int(math.ceil(math.log(n) / math.log(3))))