⑴ 這道題怎麼做(請給出詳細演算法和程序,使用PASCAL語言)
……這個題思考復雜度還好吧……題目類型:貪心
我先從樣例給你分析,然後告訴你演算法流程,你先自己試試能不能用pascal實現,如果實在不行,你再留言,我幫你寫程序。畢竟自己寫出來的東西印象深。
分析:如果把樣例按由小到大排序得:17,18,19,26,30,38,41。有這樣一個事實:對於一個數,他當主場,只有在他前面的數可當他客場。他當客場,只有他後面的數可當主場。先分析他當主場的情況,因為數列嚴格遞增,所以假設選第i個數當主場,那麼最優的客場應該為i-1,因為如果不選i-1當客場,假設選i-2當客場,那麼a[i]-a[i-1]>a[i]-a[i-2]所以選i-1當客場更優。
那麼我們把排序後序列做差,得1,1,7,4,8,3,從差中選出最小的前k個求和即為所求。
演算法流程:1、讀入n個數,排序
2、對於n個數,從第二個數開始,每個數與前一個數做差得到n-1個數。
3、對n-1個數取前k個求和,和即為所求。
標程:若無法自己完成程序,請寫信到[email protected]。
只有自己寫出來過,印象才深。
⑵ 求一個演算法(貪心演算法)
首先,無所謂哪裡密集哪裡不密集的說法,這是人為的區分,需要首先遍歷全部格子才能確定,是最慢的演算法,全部遍歷過了就可以得出最優的路線了.
既然用貪心演算法,為了思考方便,可以假設棋盤無窮大,演算法的目的是判斷下一步該往右走還是往下走,思想如下:
判斷當前格子右、下兩個相鄰的格子是否有金塊,情形如下:
1)如果一個有一個沒有,則往有金塊的格子走
2)如果都沒有或都有,則需要判斷往哪個方向走能更快的拾到下一個金塊,方法如下:
讓機器人假設地各往兩個方向走一步,然後對當前格子作判斷情形如下:
A)一個格子繼續走能拾到金塊,另一個不能,則上一步往該格子走
B)如果仍舊都有或都沒有,重復2)直到找到符合A)的情形。
假設棋盤是N*N個格子,則貪心演算法最壞的情形是要遍歷整個棋盤,比如只有第一個格子有金塊時,就需要遍歷整個棋盤才能確定走法。最好的情形也需要遍歷4*N個格子。
時間復雜度上來算的話,應該是O(nLogn)
⑶ 如何寫一個演算法
演算法是在有限步驟內求解某一問題所使用的一組定義明確的規則。通俗點說,就是計算機解題的過程。在這個過程中,無論是形成解題思路還是編寫程序,都是在實施某種演算法。前者是推理實現的演算法,後者是操作實現的演算法。 一個演算法應該具有以下五個重要的特徵: 1、有窮性: 一個演算法必須保證執行有限步之後結束; 2、確切性: 演算法的每一步驟必須有確切的定義; 3、輸入:一個演算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定除了初始條件; 4、輸出:一個演算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的演算法是毫無意義的; 5、可行性: 演算法原則上能夠精確地運行,而且人們用筆和紙做有限次運算後即可完成。 當遇到一個演算法問題時,首先要知道自己以前有沒有處理過這種問題.如果見過,那麼你一般會順利地做出來;如果沒見過,那麼考慮以下問題: 當遇到一個演算法問題時,首先要知道自己以前有沒有處理過這種問題.如果見過,那麼你一般會順利地做出來;如果沒見過,那麼考慮以下問題: 1. 問題是否是建立在某種已知的熟悉的數據結構(例如,二*樹)上?如果不是,則要自己設計數據結構。 2. 問題所要求編寫的演算法屬於以下哪種類型?(建立數據結構,修改數據結構,遍歷,查找,排序...)3. 分析問題所要求編寫的演算法的數學性質.是否具備遞歸特徵?(對於遞歸程序設計,只要設計出合理的參數表以及遞歸結束的條件,則基本上大功告成.)4. 繼續分析問題的數學本質.根據你以前的編程經驗,設想一種可能是可行的解決辦法,並證明這種解決辦法的正確性.如果題目對演算法有時空方面的要求,證明你的設想滿足其要求.一般的,時間效率和空間效率難以兼得.有時必須通過建立輔助存儲的方法來節省時間.5. 通過一段時間的分析,你對解決這個問題已經有了自己的一些思路.或者說,你已經可以用自然語言把你的演算法簡單描述出來.繼續驗證其正確性,努力發現其中的錯誤並找出解決辦法.在必要的時候(發現了無法解決的矛盾),推翻自己的思路,從頭開始構思.6. 確認你的思路可行以後,開始編寫程序.在編寫代碼的過程中,盡可能把各種問題考慮得詳細,周密.程序應該具有良好的結構,並且在關鍵的地方配有注釋.7. 舉一個例子,然後在紙上用筆執行你的程序,進一步驗證其正確性.當遇到與你的設想不符的情況時,分析問題產生的原因是編程方面的問題還是演算法思想本身有問題. 8. 如果程序通過了上述正確性驗證,那麼在將其進一步優化或簡化。 9. 撰寫思路分析,注釋. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------看不懂,還是不明白,有誰清楚告訴我啊,
⑷ 怎樣快速判斷一個編程題用什麽樣的演算法
這個要靠積累,見的題多了,自然能很快地選擇合適的演算法。
還要有比較豐富的知識,比如你想求一元二次方程的根,你要知道根的計算公式。想求是不是閏年,你要了解閏年的判斷規則。
其實最主要的是經驗,要多練,看一些經典類型的題目,如排序,循環,數組,可以挑一些感興趣的題目練習一下。