問題描述:
假設存在n個籤,通過抽取四次,如果四次抽取的和為m即勝利。
初始解:
1難度增加,將n的限制條件為1~1000,此時,四重迴圈明顯複雜度過高,需改進演算法。for(int a = 0; a < n; a++)212
}13}14 }
上面所記載的程式的迴圈部分。最內側關於d的迴圈所做的事就是
檢查是否有d使得
通過對式子移項,就能得到另一種表示式
檢查是否有d使得
就是說,檢查陣列k中所有元素,判斷是否有
結合二分搜尋進行求解,注意二分搜尋前提為該陣列排好序(可用c++自帶的binary_serach)
1intn, 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使得
這種情況並不能直接使用二分搜尋。但是,如果預先列舉出
所得的個數字併排好序,便可以利用二分搜尋了。
1intn, 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...