這道題可以用 貪心 + 大根堆 來解決。
先把題目放上來。
描述
有n個魚塘排成一排(n<
100),每個魚塘中有一定數量的魚,例如:n=
5時,如下表:
魚塘編號 123
45每1分鐘能釣到的魚的數量(1.
.1000) 10
1420169
每1分鐘能釣魚數的減少量(1.
.100) 246
5354
4即:在第1個魚塘中釣魚第1分鐘內可釣到10條魚,第2分鐘內只能釣到8條魚,……,第5分鐘以後再也釣不到魚了。從第1個魚塘到第2個魚塘需要3分鐘,從第2個魚塘到第3個魚塘需要5分鐘,……
給出乙個截止時間t
(t<
1000
),設計乙個釣魚方案,從第1個魚塘出發,希望能釣到最多的魚。
假設能釣到魚的數量僅和已釣魚的次數有關,且每次釣魚的時間都是整數分鐘。
輸入格式
共5行,分別表示:
第1行為n;
第2行為第1分鐘各個魚塘能釣到的魚的數量,每個資料之間用一空格隔開;
第3行為每過1分鐘各個魚塘釣魚數的減少量,每個資料之間用一空格隔開;
第4行為當前魚塘到下乙個相鄰魚塘需要的時間;
第5行為截止時間t。
輸出格式
乙個整數(不超過2
^31−1),表示你的方案能釣到的最多的魚。
這道題我們可以先想一下貪心思路:
首先我們知道:
所以我們可以先列舉只走到魚池 k 而不去後面的魚池能釣到的最多的魚。我就在**上面講吧。
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
105;
struct nodeheap[maxn]
, a, len;
//定義乙個結構體,第乙個是釣到的魚的數量,第二個是魚池的編號
int t[maxn]
, f[maxn]
, d[maxn]
;//分別為從 i 魚池到 i + 1 魚池的時間,在 i 魚池最開始每分鐘能釣到的魚的數量,在 i 魚池每一分鐘減少的魚的數量
/*void maintain(int x, int len)
}*///這是乙個錯誤的維護大根堆的方式,至於**錯了,讀者可以自行嘗試查詢(我一開始是這樣寫的)
void
maintain
(int i,
int k)
else
break
;//如果現在的值本來就是優,那就可以直接跳出(看不懂建議先做兩道堆的模板題)
} heap[i]
= a;
//把他更新,此時的 heap[i] 與原來的 heap[i] 不同,可以自己思考
}int
main()
for(
int i =
1; i <= n; i++
)for
(int i =
1; i <= n -
1; i++
)int m, t1 =0;
//t1為已經用掉的時間
scanf
("%d"
,&m)
;//輸入
for(
int k =
1; k <= n; k++
)//初始化,更新資料,等會維護大根堆
for(
int i =
1; i <= k/
2; i++
)while
((time >0)
&&(heap[1]
.fish >0)
) max_ =
max(max_, ans)
;//更新最終答案
t1 +
= t[k]
;//走到那裡已經花的時間,累加
}printf
("%d"
, max_)
;//輸出
return0;
//完美結束
}
部落格就到這裡了,有什麼寫得不好的還請指出
最後,還是感謝拜讀!
魚塘釣魚(fishing)
給出乙個截止時間t t 1000 設計乙個釣魚方案,從第1個魚塘出發,希望能釣到最多的魚。假設能釣到魚的數量僅和已釣魚的次數有關,且每次釣魚的時間都是整數分鐘。輸入格式 輸入檔案共5行,分別表示 第1行為n 第2行為第1分鐘各個魚塘能釣到的魚的數量,每個資料之間用一空格隔開 第3行為每過1分鐘各個魚...
魚塘釣魚 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 當前魚塘到下...