小 q 有 n 個砝碼,它們的質量分別為 1 克、 2 克、……、 n 克。他給 i 克的砝碼標上了編號 i (i = 1, 2, …, n),但是編號被人打亂了,即編號為 i 的砝碼不一定是 i 克,而是 a_i 克,這裡 a 指的是 1 到 n 的乙個排列。
他有一桿天平,可以向天平的兩側放任意數量的砝碼,通過一次稱量得到兩側質量的大小關係,關係只有左側重、一樣重、右側重三種可能。
他想知道,最壞情況下,他至少需要稱量多少次,才能確定其中至少乙個編號為 i 的砝碼的質量是 i 克或不是 i 克。
例如 n = 6 時,可以只稱量一次,選擇編號為 1、 2、 3 的砝碼放在左側,編號為 6 的砝碼放在右側。
如果天平不是平的,則可以確定存在至少乙個砝碼 i 不是 i 克 (i = 1, 2, 3, 6),否則編號為 6 的砝碼一定是 6 克。
再例如 n = 5 時,可以只稱量兩次,第一次選擇編號為 2、3 的砝碼放在左側,編號為 5 的砝碼放在右側,第二次選擇編號為 1、4 的砝碼放在左側,編號為 5 的砝碼放在右側。
這裡略去這樣稱量的正確性,留給做題人推導和證明。
輸入包含多組測試資料。每行對應一組測試資料,包含乙個正整數 n 。
不超過 10^5 組資料,1 ≤ n ≤ 10^9。
每行對應一組測試資料,輸出乙個正整數表示答案。
1
56
0
21
最壞情況就是每次稱量的結果都和把 ai當作 i 稱量的結果相同,所以只用考慮在這種情況下要多少次稱量才能稱量出至少一定有乙個 ai
=i。顯然答案不會超過
3 ,因為高斯證明過任意乙個正整數可以表示成三個三角形數的和。
實際上答案最大是
2,通過觀察或模擬,我們可以得到以下結論:
這乙個序列叫做
baron munchhausen's sequence
,相關證明:判斷乙個數是不是平方數隻需要將其開根下取整再平方進行檢驗,判斷三角形數同理。
#include
using
namespace
std;
typedef
long
long ll;
int main()
ll low = ((ll)sqrt(8*n+1)-1)/2;
ll sjx = low*(low+1)/2;
ll ls = n*(n+1)/2;
ll sq = (ll)sqrt(ls)*(ll)sqrt(ls);
if(sjx == n || sjx + 1 == n)
cout
<<1
if(sq == ls||sq + 1 ==ls)
cout
<<1
cout
<<2
0;}
1837 砝碼稱重
小 q 有 n 個砝碼,它們的質量分別為 1 克 2 克 n 克。他給 i 克的砝碼標上了編號 i i 1,2,n 但是編號被人打亂了,即編號為 i 的砝碼不一定是 i 克,而是 a i 克,這裡 a 指的是 1 到 n 的乙個排列。他有一桿天平,可以向天平的兩側放任意數量的砝碼,通過一次稱量得到兩...
1837 砝碼稱重
1837 砝碼稱重 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 小 q 有 n 個砝碼,它們的質量分別為 1 克 2 克 n 克。他給 i 克的砝碼標上了編號 i i 1,2,n 但是編號被人打亂了,即編號為 i 的砝碼不一定是 i 克,而是 a i 克,這裡...
51Nod 砝碼稱重
1449 砝碼稱重 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 現在有好多種砝碼,他們的重量是 w0 w1,w2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。樣例解釋 可以將重物和3放到乙個托盤中,9和1放到另外乙個托盤中。in...