書中只給出演算法函式,程式所用資料預設已讀入程式並儲存在全域性變數中。
以高效演算法為目標,需要正確估算各種演算法的複雜度。
縮短執行時間,主要應該從複雜度入手。
程式都從標準輸入按指定格式讀入資料
輸入資料已經由main函式讀入並儲存在全域性變數中
通過呼叫solve函式來求解
在設計滿足問題要求的演算法時,我們不可能挨個去試,應當通過估算演算法複雜度來判斷。
在分析複雜度時,我們通常考慮它與什麼成正比,並稱之為演算法的階。
例如
1.1 四重迴圈,每重n次,執行的時間與n⁴成正比。
我們將與n⁴成正比寫作 o(n⁴),將對應的時間寫作 o(n⁴) 時間。
程式的執行時間不光取決於複雜度,也會受到諸如迴圈體的複雜性等因素的影響。
但是,因此造成的差距多數情況下最多也就幾十倍。
另一方面,忽略其餘因素,n=1000時,o(n³)時間的演算法和o(n²)時間的演算法差距就是1000倍。
因此要縮短執行時間,主要應該從複雜度入手。
估算出演算法的複雜度後,只要將數值可能的最大值帶入帶入複雜的漸進式中,就能簡單的判斷演算法是否能滿足執行時間限制的要求。
例如
考慮 o(n²) 時間的演算法,限制條件是n<=1000,將n=1000代入 n的平方 就得到了1000000。
在這個數值的基礎上,我們就可以結合下表進行判斷。
假設時間限制為1秒
1e6 完全沒問題
1e7 勉強能滿足
1e8 演算法迴圈體稍微複雜一點就很可能超時
挑戰程式設計競賽學習筆記1
const定義的變數值在程式執行過程中不允許發生改變 printf根據格式符輸出對應型別 putchar只能輸出字元 puts可以輸出字串 設計高效且正確的演算法 正確地實現 並且,為了設計演算法,靈活的想象力 演算法的基礎知識 也是必不可少的。程式設計競賽就是以程式設計為主題舉辦的競賽。n個紙片,...
挑戰程式設計競賽學習筆記4
想象力很重要,要從複雜中看出本質。暴搜雖然幾乎萬能,但是越複雜時間越長,能不用就不用。n只螞蟻,均以1cm s的速度,在長為lcm的桿子上爬行。爬到端點掉落,相遇時掉頭爬,已知每只螞蟻據竿子左端的距離xi,朝向未知。求所有螞蟻落下桿子所需的最短時間和最長時間。1 l 1e6 1 n 1e6 0 x ...
挑戰程式設計競賽學習筆記5
不僅要熟練掌握基礎演算法,豐富的想象力亦是非常重要的。二分查詢的複雜度是o logn 的,即便n變得很大,對數時間的演算法依然非常快速。如果把最開始的問題中的n的限制條件改為1 n 1000,最初的四重迴圈o n的4次方 複雜度的演算法顯然不夠,必須改進演算法。for int a 0 a上為最初程式...