挑戰程式設計競賽學習筆記4

2021-10-04 11:26:05 字數 1330 閱讀 7570

想象力很重要,要從複雜中看出本質。暴搜雖然幾乎萬能,但是越複雜時間越長,能不用就不用。

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上為最初程式...