想象力很重要,要從複雜中看出本質。暴搜雖然幾乎萬能,但是越複雜時間越長,能不用就不用。
n只螞蟻,均以1cm/s的速度,在長為lcm的桿子上爬行。
爬到端點掉落,相遇時掉頭爬,已知每只螞蟻據竿子左端的距離xi,朝向未知。
求所有螞蟻落下桿子所需的最短時間和最長時間。
1<=l<=1e6
1<=n<=1e6
0<=xᵢ<=l
輸入:l=10
n=3x=
輸出:min=4(左右右)
max=8(右右右)
首先是暴搜,每只螞蟻有2個朝向,n只螞蟻就是2ⁿ,若n較小,此演算法可行,但本題n的範圍顯然過大。
2的n次方增長的趨勢 n
151020
301e2
1e31e6
2的n次方232
1024
1048576
1e91e30
1e3010
1e301030
指數函式隨著n的增長會急速增長,暴搜的執行時間也隨之急速增長。
一般把指數階的執行時間叫做指數時間。指數時間的演算法無法處理稍大規模的輸入。
接下來讓我們重新思考一下題目
最短時間就是每只螞蟻都朝著自己距離最短的一端爬,這種情況下不會發生相遇。
相遇時兩隻螞蟻會反向爬,如果無視螞蟻的區別,則可認為是保持原樣交錯而過。
最長時間就是求螞蟻到竿子端點最大距離。
最後,這樣求最短時間和最長時間,則只需要檢查一遍螞蟻,演算法複雜度為o(n)。
#include#include using namespace std;
const int max_n = 100000;
//輸入
int l=10,n=3;
int x[max_n]=;
void solve(){
//計算最短時間
int mint=0;
for(int i=0;i該問題是經典的考察想象力型別問題。
有很多這樣的問題,雖然開始不太明白,但是想通之後,最後的程式卻出乎意料的簡單。
挑戰程式設計競賽學習筆記1
const定義的變數值在程式執行過程中不允許發生改變 printf根據格式符輸出對應型別 putchar只能輸出字元 puts可以輸出字串 設計高效且正確的演算法 正確地實現 並且,為了設計演算法,靈活的想象力 演算法的基礎知識 也是必不可少的。程式設計競賽就是以程式設計為主題舉辦的競賽。n個紙片,...
挑戰程式設計競賽學習筆記2
書中只給出演算法函式,程式所用資料預設已讀入程式並儲存在全域性變數中。以高效演算法為目標,需要正確估算各種演算法的複雜度。縮短執行時間,主要應該從複雜度入手。程式都從標準輸入按指定格式讀入資料 輸入資料已經由main函式讀入並儲存在全域性變數中 通過呼叫solve函式來求解 在設計滿足問題要求的演算...
挑戰程式設計競賽學習筆記5
不僅要熟練掌握基礎演算法,豐富的想象力亦是非常重要的。二分查詢的複雜度是o logn 的,即便n變得很大,對數時間的演算法依然非常快速。如果把最開始的問題中的n的限制條件改為1 n 1000,最初的四重迴圈o n的4次方 複雜度的演算法顯然不夠,必須改進演算法。for int a 0 a上為最初程式...