USC Problem A 釣魚 貪心

2021-07-11 11:11:17 字數 1384 閱讀 9296

題目意思:有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 個湖需要...