貪心的原理簡單,使用方便。最近又做了幾道題鞏固,做一下解題總結。
第一道題,貓糧換豌豆。貪心策略可模擬於揹包問題,根據價效比降序排列,如果貓糧有剩餘就優先換價效比高的豌豆,當剩餘貓糧少於要求數時按比例兌換。
解題步驟:建立結構體陣列,計算價效比,降序排序,判斷情況,累計貓糧。
第二題,打折**買三免一。貪心策略的關鍵是排序方式,只有按降序排序才能達到最大優惠,因為當購買商品的數額不是三的倍數時就會留下1或2個無法優惠的,而降序排序可以保證剩下的是最便宜的。另外要注意清空動態陣列。
解題步驟:建立動態陣列,降序排序,從第三個元素開始,隔三加和。
第三題,奶牛叫。這道題最難的是如何降低時間複雜度,最簡單的方法就是暴力迴圈,累加任意兩元素之間的差。但是,不好意思(눈_눈)超時。所以這道題成功的轉型成找規律,幾經周折,還是借鑑了別人的。 sum+=(n-1-i)*(v[n-1-i]-v[i]);
這就是整個題目最重要的部分,也是最不能理解的地方。唯有問一下老師了。
第四題,北大騎車的查理。初讀題目,覺得很是複雜,查理要來回倒騰,於是想著計算每一次交換時的時間,然後求和。後來才發覺查理一直跟的是速度最快的人,所以可以先排序,找出最快的人,然後計算其花費的時間,與出發時間相加求和即可。值得注意的是,當出發時間小於0時,無論速度快慢都與查理無關,因為快了在到校之前查理趕不上,慢了趕不上查理。另外涉及到了乙個很重要的函式ceil
用 法: double ceil(double x);
功 能: 返回大於或者等於指定表示式的最小整數標頭檔案:math.h說明:float ceil ( float value )返回不小於 value 的下乙個整數,value 如果有小數部分則進一位。ceil() 返回的型別仍然是 float,因為 float 值的範圍通常比 integer 要大。
用來取整。
解題步驟:建立結構體陣列,將出發時間小於零的置為0,計算每個人到達目的地的時間,降序排序。 第五道題,最大銷售利潤。貪心策略是將利潤最大的商品放到保質期的最後一天售賣,先賣利潤較低的。利用陣列元素是否為零判斷當天是否售賣過商品,利用保質期自減運算元組腳標。
解題步驟:建立結構體陣列和普通陣列並將普通陣列初始化為0(表示當天沒有售賣過商品)公升序排序,從保質期最多的一天開始依次累加。 明天上課,聽老費講題,期待(๑˙ー˙๑)
貪心演算法學習
基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備...
演算法學習 貪心演算法
所謂貪心演算法,是在對問題求解時,總是做出在當前看來最好的選擇。即,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,就是某個狀態以前的過程不會影響以後的狀態,只與當前的狀態有關。貪心...
演算法學習 貪心演算法
想通過這篇部落格來分享一下學習貪心演算法和動態規劃的過程 首先什麼是貪心演算法?翻譯 話就是用簡單粗暴的方式,以最少的代價 占用的時間和空間 得出結果。比如某麵包店有a b c三種大小的麵包,其中a麵包可以提供10點能量售價5元,b麵包可以提供8點能量售價3元,c麵包可以提供2點能量售價1元。現在有...