Problem 4. 偽造的金幣!!
(Time Limit: 2 seconds)
問題描述 :
在 n 袋金幣中,有一袋金幣是偽造的,但我們不知道哪一袋金幣是偽造的
金幣,我們知道偽造的金幣比真的金幣還輕,而手邊又正好只有沒有刻度的天秤,
天秤的一端可放多袋金幣,聰明的你最多需要使用天秤幾次,保證一定能找出哪
一袋是偽造的金幣。
輸入說明:
第一行為一個整數 N ( 0 < N ≤ 20 ) 代表有 N 組測試資料,之後會有 N 行
數字,每一行數字代表 n ( 2 ≤ n ≤ 1000000 ) 袋金幣。
輸出說明:
輸出 N 組測試資料可使用天秤的最多次數,最後必須有換行字元。
範例:
Sample Input: Sample Output:
3 2
8 3
17 5
100
重點說明:這題在我吃著火腿炒飯想出來的
因為他說要一定要找出來那袋假的,且一定要是次數最少的
簡單來說就是當你分成兩份的時候,也會有留剩下來的或是沒有
例如8袋,最一開始可以分成四袋四袋,然後一定會有一邊有假的
接下來就重複動作,兩袋兩袋,最後剩兩袋,這時候就可以一定知道哪邊是假的,這樣總共分了三次
可是如果一開始分成三袋三袋,這樣留下來的會有兩袋,在磅秤上的那兩邊
一定會有一邊是有假的,因為如果是平的為真,這樣你只要比剩下的兩袋,可是這樣有個問題,就是他一定要找出來,所以這樣會有問題,所以在磅秤上比的結果必定要為False,除非到了只剩3袋以下
簡單來說就是2X+Y=總袋數 X>=Y到最接近
程式碼:
import java.util.Scanner;
public class ITSA50_4 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
while(n-->0){
int t=sc.nextInt();
int time=0;
int a=t/2;
int i;
while(a!=1){
for(i=a;;i--){
if(!(i>=t-i*2)){
break;
}
}
a=i+1;
t=a;
time++;
//System.out.println(a);
}
System.out.println(time);
}
}
}