解題觀念
Greedy + STL
可以參考我的課程簡報:Greedy & Graph
題目敘述
John 想花 h 小時去 n 個湖泊釣魚(湖泊由左至右編號1, 2, 3….n)
他希望先安排行程,讓本次釣魚行程有最大的漁獲量
他規劃從湖泊 1 開始,可以選擇花費時間釣魚或是直接去湖泊 2
如果過了一個湖泊就不能回頭
而每個湖泊前 5 分鐘可釣到 f 隻魚,而每釣 5 分鐘釣魚量會減少 d 隻
另會給予湖泊 I 與湖泊 i+1 間的交通時間 ti (為 5 分鐘的倍數)
請設計一個可有最大漁獲量的行程
如果不只一個最大漁獲量行程,則輸出從湖泊 1 釣魚時間 ~ 湖泊 n 釣魚
時間中字典序最大的一組行程
每組輸入中
第一行為數字 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; 
          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;     } }
   |