抽籤問題(不斷優化)

2022-09-04 01:36:08 字數 1190 閱讀 6031

問題描述:

假設存在n個籤,通過抽取四次,如果四次抽取的和為m即勝利。

初始解:

1

for(int a = 0; a < n; a++)212

}13}14 }

難度增加,將n的限制條件為1~1000,此時,四重迴圈明顯複雜度過高,需改進演算法。

上面所記載的程式的迴圈部分。最內側關於d的迴圈所做的事就是

檢查是否有d使得

通過對式子移項,就能得到另一種表示式

檢查是否有d使得

就是說,檢查陣列k中所有元素,判斷是否有

結合二分搜尋進行求解,注意二分搜尋前提為該陣列排好序(可用c++自帶的binary_serach)

1

intn, m, k[max_n];23

bool binary_serach(intx)4

16return

false;17

}1819void

solve()

2033}34

}35}36

if(f)

37 cout << "

yes"

<

38else

39 cout << "no"

<

40 }

的演算法著眼於內層的兩個迴圈

檢查是否有c和d使得

這種情況並不能直接使用二分搜尋。但是,如果預先列舉出

所得的個數字併排好序,便可以利用二分搜尋了。

1

intn, m, k[max_n];

2int kk[max_n *max_n];

3bool binary_serach(intx)4

16return

false;17

}1819void

solve()

2027}28

29 sort(kk, kk + n *n);

30for(int a = 0; a < n; a++)

3138}39

}40if(f)

41 cout << "

yes"

<

42else

43 cout << "no"

<

44 }

暴力列舉演算法的優化 抽籤問題

將寫有數字的n個紙片放入口袋中,你可以一次從口袋抽取4次紙片,每次記下紙片的數字後將其放回口袋。如果這4個數字的和是m,那麼你就贏了,否則你就輸了。編寫程式,判斷當紙片上的數字是k1,k2,kn時,是否存在抽取4次和為m的方案。如果存在,輸出yes 否則輸出no.限制條件,資料規模 1 n 1000...

演算法小題之抽籤問題

抽籤問題 你的朋友提議玩乙個遊戲 將寫有數字的n 個紙片放入口袋中,你可以從口袋中抽取 4次紙片,每次記下紙片上的數字後都將其放回口袋中。如果這 4個數字的和是 m,就是你贏,否則就是你的朋友贏。請你編寫乙個程式,判斷當紙片上所寫的數字是k1,k2,kn時,是否存在抽取4 次和為m 的方案。如果存在...

關於演算法不斷優化的樂趣

看了一道很常規的演算法題,要求計算陣列中,相加為0的3個數,當然還有相加為0的4個數 以後看了再寫 因為要在乙個一維陣列中尋找3個數,首先想到暴力搜尋,演算法複雜度為o n 3 於是想到,先對陣列排序,複雜度為o nlogn 遠小於o n 3 然後實現了通過兩邊夾的思路實現了演算法,但是在leetc...