題目意思:有n個小湖序號從1到n,每個小湖每5分鐘能釣到fi數量的魚,但每過5分鐘在此小湖釣到的魚的數量就會減少di,從小湖i到i+1需要的時間為ti,不能回頭,也就是不能從i+1號小湖到i號小湖,給你h小時,問最多能釣到多少魚,最後釣魚的人可能停到任意小湖。
解題思路:一開始還以為是簡單的dp,寫了寫,發現複雜度**還超級難寫,後來發現是貪心題。。。
我們可以列舉釣魚人最後停到哪個小湖,直接用總時間減去到最後乙個小湖的時間,這樣就不用考慮走路花費的時間了。
假設釣魚人最後停到了小湖i,我們每次從1-i號小湖中選取可以釣到最多魚的小湖去釣魚,選取完之後減去相應的di,重複做這樣的操作直到時間為0,得到釣魚人最後停到小湖i時能釣到的魚。
最後列舉i我們便能得到結果,但如果列舉求可以釣到魚最多的小湖會超時,所以我們要用優先佇列來維護。特殊:如果釣到的魚數量一樣則優先彈出序號小的。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d %d",&(n),&(m))
#define riii(n,m,k) scanf("%d %d %d",&(n),&(m),&(k))
#define mem(a) memset((a),0,sizeof(a))
using
namespace
std;
const
int inf=1e9;
const
int inf1=-1*1e9;
typedef
long
long ll;
struct p
;struct cmp
while(h2-5>=0)
}if(ans2>ans)
int summ=0;
int endd;
for(int i=0;i5;
if(ans1[i]) endd=i;
}summ=h-summ;
for(int i=0;i<=endd;i++)
if(summ<0) summ=0;
for(int i=0;i1;i++)
cout
<1]*5
<<"number of fish expected: "
0;}
魚塘釣魚(貪心演算法) 演算法設計
魚塘釣魚 貪心演算法 演算法設計 約翰有h 1 h 16 個小時的時間,在該地區有n 2 n 25 個湖,這些湖剛好分布在一條路線上,該路線是單向的。約翰從湖1出發,他可以在任乙個湖結束釣魚。但他只能從乙個湖到達另乙個與之相鄰的湖,而且不必每個湖都停留。已知在最初5分鐘,湖i預計釣到魚的數量為fi ...
POJ 1042 貪心 DP 釣魚問題)
被這個題虐的一塌糊塗啊,時間有兩個世紀那麼長 有dp和貪心兩種解法 下面dp 狀態轉移方程 dp i j max dp i j dp i 1 j ti i k 但是因為memset dp,1,sizeof dp 所以寫的時候是 dp i 1 j k ti i max dp i j sum,dp i ...
c 貪心釣魚問題 最簡單的思路
在一條水平路邊,有 nn 個釣魚湖,從左到右編號為 1,2,n1,2,n。佳佳有 hh 個小時的空餘時間,他希望利用這個時間釣到更多的魚。他從 11 出發,向右走,有選擇的在一些湖邊停留一定的時間 是 55 分鐘的倍數 釣魚。最後在某乙個湖邊結束釣魚。佳佳從第 ii 個湖到第 i 1i 1 個湖需要...