魚塘釣魚(fishing)

2021-07-16 20:54:23 字數 1503 閱讀 8375

給出乙個截止時間t(t<1000),設計乙個釣魚方案,從第1個魚塘出發,希望能釣到最多的魚。

假設能釣到魚的數量僅和已釣魚的次數有關,且每次釣魚的時間都是整數分鐘。

【輸入格式】

輸入檔案共5行,分別表示:

第1行為n;

第2行為第1分鐘各個魚塘能釣到的魚的數量,每個資料之間用一空格隔開;

第3行為每過1分鐘各個魚塘釣魚數的減少量,每個資料之間用一空格隔開;

第4行為當前魚塘到下乙個相鄰魚塘需要的時間;

第5行為截止時間t;

【輸出格式】

輸出檔案僅乙個整數(不超過231-1),表示你的方案能釣到的最多的魚。

【輸入樣例】

5 10 14 20 16 9

2 4 6 5 3

3 5 4 4

14 【輸出樣例】

76 【知識準備】

最優化原理、貪心法、動態規劃、用堆結構實現貪心。

【問題分析】

演算法一:

我們可以這樣想:如果知道了取到最大值的情況下,人最後在第i個魚塘裡釣魚,那麼用在路上的時間是固定的,因為我們不會先跑到第i個魚塘裡釣一分鐘後再返回前面的魚塘釣魚,這樣把時間浪費在路上顯然不划算,再說在你沒到某個魚塘裡去釣魚之前,這個塘裡的魚也不會跑掉(即數量不會減少)。所以這時我們是按照從左往右的順序釣魚的,也可以看成路上是不需要時間的,即人可以自由在1~i個魚塘之間來回走,只要盡可能選取釣到的魚多的地方就可以了,這就是我們的貪心思想。其實,這個貪心思想並不是模擬釣魚的過程,只是統計出在各個魚塘釣魚的次數。程式實現時,只要分別列舉釣魚的終

點魚塘(從魚塘1到魚塘n),每次按照上述貪心思想確定在哪些魚塘裡釣魚,經過n次後確定後最終得到的一定是最優方案。

#include

#include

using

namespace

std;

int a[105],b[105],c[105],v[105];

int main()

for (int i=1;i<=n;++i)

cin>>b[i];

for (int i=1;i<=n-1;++i)

int ma***=0;

int t;cin>>t;

for (int i=1;i<=n;++i)

}v[xh]=v[xh]-b[xh];

ans+=maxx;

}ma***=max(ma***,ans);

}cout

《演算法二:

其實,這道題是考慮最優性問題的,所以我們也可以用動態規劃來解決,假設用opt[t][n]來表示第t分鐘時,人在第n個魚塘裡釣魚,最多所能釣到的魚數。則:

opt[t][n] =maxinum;

窮舉k,s為t-k+1到t之間,除去從第n-1的魚塘走到第n個魚塘的時間,在第n個魚塘中可以釣到的魚數。

演算法三:

建立以fish為關鍵字的大根堆,包括能釣到魚的數量和池塘的編號。然後借助列舉創造條件,實現複雜度為o(m*nlogn)的演算法。

魚塘釣魚 fishing)

魚塘釣魚 fishing 時間限制 1000 ms 記憶體限制 65536 kb 提交數 71 通過數 42 題目描述 有n個魚塘排成一排 n 100 每個魚塘中有一定數量的魚,例如 n 5時,如下表 魚塘編號 每1分鐘能釣到的魚的數量 1.1000 每1分鐘能釣魚數的減少量 1.100 當前魚塘到...

魚塘釣魚 fishing)

時間限制 1000 ms 記憶體限制 65536 kb 提交數 149 通過數 81 三種做法 純貪心做法 堆維護dp 有n個魚塘排成一排 n 100 每個魚塘中有一定數量的魚,例如 n 5時,如下表 魚塘編號每1分鐘能釣到的魚的數量 1.1000 每1分鐘能釣魚數的減少量 1.100 當前魚塘到下...

魚塘釣魚題解(堆解決)

這道題可以用 貪心 大根堆 來解決。先把題目放上來。描述 有n個魚塘排成一排 n 100 每個魚塘中有一定數量的魚,例如 n 5時,如下表 魚塘編號 123 45每1分鐘能釣到的魚的數量 1.1000 10 1420169 每1分鐘能釣魚數的減少量 1.100 246 5354 4即 在第1個魚塘中...