# Math# Logarithm

b911 - 我想跟Kevin借筷子系列4

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算將長度分別為 1 到 n 的 n 支筷子,透過每次選擇一些筷子並同時減少相同長度的方式,將所有筷子砍至長度為 0 所需的最少操作次數。

解題思路

觀察題目可以發現,每次操作的目標是將一些筷子的長度減少相同的數值。最終目標是將所有筷子長度都變為 0。 由於筷子的初始長度為 1 到 n,可以將問題轉化為找到一個最小的 k 值,使得所有數字都能被 k 整除。 實際上,最少操作次數等於 n 的二進位表示中 1 的個數。 例如,n = 2,二進位表示為 10,操作次數為 2。 n = 3,二進位表示為 11,操作次數為 2。 n = 4,二進位表示為 100,操作次數為 1。 n = 5,二進位表示為 101,操作次數為 2。 n = 6,二進位表示為 110,操作次數為 2。 n = 7,二進位表示為 111,操作次數為 3。 n = 8,二進位表示為 1000,操作次數為 1。 因此,最少操作次數等於 log2(n) 的向上取整。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

#include <stdio.h>
#include <math.h>
int main(){
	int ans;
	while(scanf("%d",&ans)>0)
		printf("%d\n",(int)log2(ans)+1);
}

Discussion