小 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 5 6
0 2 1馬拉松的t1,一開始以為是一道打卡題,結果題目讀了半天才勉強理解題意,比賽的時候沒打出來,直到結束,看了大神的解釋,才漸漸理解,賽後第三個ac了此題,拿到了51nod第一枚牌子(雖然是銅牌)其實弄懂規律以後題目還是好做的,易想到最多兩次便可以稱出來,但具體是一次還是兩次(當然,只有乙個砝碼的時候是0次),所以我們要分四種情況考慮,具體詳見**
#include
#include
#include
#include
using
namespace
std;
long
long n;
int gauss(int x)
return l;
}int main()
long
long k=gauss(n);
if (k*(k+1)/2==n)
else
long
long m=(n+1)*n/2;
long
long g=sqrt(1.0*m);
while (g*gif (g*g==m)
m=(n+1)*n/2-1;
g=sqrt(1.0*m);
while (g*gif (g*g==m)
printf("2\n");}}
return
0;}
事實證明,我是個蒟蒻,馬拉松實力爆蛋
**醜陋,大神勿噴
1837 砝碼稱重
1837 砝碼稱重 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 小 q 有 n 個砝碼,它們的質量分別為 1 克 2 克 n 克。他給 i 克的砝碼標上了編號 i i 1,2,n 但是編號被人打亂了,即編號為 i 的砝碼不一定是 i 克,而是 a i 克,這裡...
51nod 1837 砝碼稱重 (規律)
小 q 有 n 個砝碼,它們的質量分別為 1 克 2 克 n 克。他給 i 克的砝碼標上了編號 i i 1,2,n 但是編號被人打亂了,即編號為 i 的砝碼不一定是 i 克,而是 a i 克,這裡 a 指的是 1 到 n 的乙個排列。他有一桿天平,可以向天平的兩側放任意數量的砝碼,通過一次稱量得到兩...
砝碼稱重 DP
砝碼稱重 問題描述 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 用他們能稱出的重量的種類數。輸入檔案 a1 a2 a3 a4 a5 a6 表示1g砝碼有a1個,2g砝碼有a2個,20g砝碼有a6個,中間有空格 輸出檔案 total n n表示用這些砝碼能稱出的不同重量...