1837 砝碼稱重

2021-08-08 23:09:22 字數 1440 閱讀 6247

小 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表示用這些砝碼能稱出的不同重量...