UVA 00757 - Gone Fishing

UVA 00757 - Gone Fishing

LAVI

解題觀念

Greedy + STL

可以參考我的課程簡報:Greedy & Graph

題目敘述

John 想花 h 小時去 n 個湖泊釣魚(湖泊由左至右編號1, 2, 3….n)
他希望先安排行程,讓本次釣魚行程有最大的漁獲量

他規劃從湖泊 1 開始,可以選擇花費時間釣魚或是直接去湖泊 2
如果過了一個湖泊就不能回頭
而每個湖泊前 5 分鐘可釣到 f 隻魚,而每釣 5 分鐘釣魚量會減少 d 隻
另會給予湖泊 I 與湖泊 i+1 間的交通時間 ti (為 5 分鐘的倍數)

請設計一個可有最大漁獲量的行程
如果不只一個最大漁獲量行程,則輸出從湖泊 1 釣魚時間 ~ 湖泊 n 釣魚
時間中字典序最大的一組行程

Input

每組輸入中
第一行為數字 n,代表有多少湖泊(湖泊由左至右編號1, 2…n)
第二行為數字 h,為 John 欲花費的釣魚時間(單位為小時)
第三行根據 n 的數量讀取 f,依序表示在第 i 個湖泊前 5 分鐘的釣魚量
第四行根據 n 的數量讀取 d,依序表示第 i 個湖泊每隔 5 分鐘減少的釣魚量
第五行根據 n-1 的數量讀取 ti,依序表示第 i 到第 i+1 個湖泊的交通時間(單
位為 5 分鐘)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
1
10 1
2 5
2
4
4
10 15 20 17
0 3 4 3
1 2 3
4
4
10 15 50 30
0 3 4 3
1 2 3
0

Output

每組輸出中
第一行為每個湖泊釣魚時間,
每個湖泊的時間之間用 “,” 和一個空白隔開
最後一個湖泊後沒有 “,” 和任何空白
第二行輸出文字:”Number of fish expected: “
和最大漁獲量,中間用一個空白隔開

每組輸出之間需相隔一行

1
2
3
4
5
6
7
8
45, 5
Number of fish expected: 31

240, 0, 0, 0
Number of fish expected: 480

115, 10, 50, 35
Number of fish expected: 724

解題觀念簡報參考

STL - Priority Queue

Greedy

Solution Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<bits/stdc++.h>
using namespace std;

struct Fishing{
int fish;
int dec;
int idx;

bool operator < (const Fishing &rhs) const{
if(fish == rhs.fish) return idx > rhs.idx;
return fish < rhs.fish;
}
}fishing[25+5];

int main(){
int n;
bool space = false;
while(cin >> n && n){
if(space) cout << endl;
space = true;

int time;
cin >> time;
time *= 60/5; // 單位時間 每次 5 分鐘

int fish[25+5], dec[25+5];
for(int i = 0; i < n; ++i){
cin >> fish[i];
}
for(int i = 0; i < n; ++i){
cin >> dec[i];
}

int trafficTime[25+5];
trafficTime[0] = 0;
for(int i = 1; i < n; ++i){
cin >> trafficTime[i];
}

int maxi = -1;
int ans[25+5];
for(int i = 0; i < n; ++i){
priority_queue<Fishing> pq;
int tmpTime = time;
for(int j = 0; j <= i; ++j){
tmpTime -= trafficTime[j];
if(fish[j] == 0) continue;
pq.push({fish[j], dec[j], j});
}

int tmpTotal = 0, tmpLake[25+5];
memset(tmpLake, 0, sizeof(tmpLake));
while(tmpTime > 0 && !pq.empty()){
Fishing now = pq.top();
pq.pop();

tmpTotal += now.fish;
tmpLake[now.idx] += 5;

tmpTime -= 1;
if(now.fish - now.dec <= 0) continue;
pq.push({now.fish - now.dec, now.dec, now.idx});
}
if(tmpTime > 0) tmpLake[0] += (tmpTime * 5);

if(tmpTotal > maxi){
for(int j = 0; j < n; ++j) ans[j] = tmpLake[j];
maxi = tmpTotal;
}
}

cout << ans[0];
for(int i = 1; i < n; ++i){
cout << ", " << ans[i];
}
cout << endl << "Number of fish expected: " << maxi << endl;
}
}