钓鱼问题(C++)

  1 #include<iostream>
  2 #include<string>
  3 #include<cmath>
  4 using namespace std;
  5 
  6 #define MAX 20
  7 int n;               // n个湖
  8 int h;                 // h个小时
  9 int maxValues = 0;  // 能钓到最多鱼时所要走到湖 i, maxValues记录i这个下标
 10 int ti[MAX];  // ti[i]: 从第 i 个湖走到第 i + 1 个湖所需时间
 11 int fi[MAX];  // fi[i]: 第i个湖第一次能的钓到的鱼的数量
 12 int cfi[MAX];  // 更新后每个湖此次能钓到鱼的数量
 13 int di[MAX];  // 在某个湖的第 i 次钓鱼时减少的钓鱼量 di[i-1]
 14 
 15 struct LakeNode {
 16     int max;         // 每个湖目前若干次钓到的鱼的数量
 17     int num[MAX];   // 每个湖
 18 };
 19 
 20 LakeNode Lakes[MAX];
 21 
 22 // 获取此时从编号 1 - j 的湖中能钓到鱼的数量最多的某个湖的下标 
 23 int getMaxIndex(int i, int j) {
 24     int maxIndex = i;
 25     for (int k = i; k <= j; k++) {
 26         if (cfi[k] > cfi[maxIndex])
 27             maxIndex = k;
 28     }
 29 
 30     return maxIndex;
 31 }
 32 
 33 
 34 void fishing() {
 35     // 在终端输入h小时,转换为分钟,分为行走和钓鱼两部分时间
 36     int T = h * 60;
 37     for (int i = 1; i <= n; i++) {
 38         for (int j = 1; j <= i; j++) {
 39             // 初始化
 40             cfi[j] = fi[j];
 41 
 42             // 1. 行走
 43             if (j < i)
 44                 T = T - 5 * ti[j];
 45         }
 46 
 47         // 2. 钓鱼
 48         int t = 0;
 49         while (t < T) {
 50             // 记录以第i个湖为结束情况的方案所能钓到的最多的鱼数量
 51             int maxIndex = getMaxIndex(1, i);
 52             Lakes[i].max += cfi[maxIndex];
 53             Lakes[i].num[maxIndex] += 5;   // 记录以第 i 个湖为结束钓鱼方案的 第j个湖所花费的时间
 54 
 55             if (cfi[maxIndex] >= di[maxIndex])
 56                 cfi[maxIndex] -= di[maxIndex];
 57             else
 58                 cfi[maxIndex] = 0;
 59             t += 5;
 60 
 61         }
 62 
 63 
 64     }
 65 
 66 
 67 
 68 }
 69 
 70 
 71 int main() {
 72 
 73     cin >> n;
 74     cin >> h;
 75 
 76     // 初始化
 77     for (int i = 1; i <= n; i++) {
 78         Lakes[i].max = 0;
 79         for (int j = 1; j <= n; j++) {
 80             Lakes[i].num[j] = 0;
 81         }
 82     }
 83 
 84     // 输入移动相邻所花费的时间
 85     cout << "输入移动相邻所花费的时间: " << endl;
 86     for (int i = 1; i < n; i++)
 87         cin >> ti[i];
 88 
 89     cout << "初始化每个湖鱼的个数:" << endl;
 90     for (int i = 1; i <= n; i++)
 91         cin >> fi[i];
 92 
 93     cout << "一个间隔鱼减少的个数:" << endl;
 94     for (int i = 1; i <= n; i++)
 95         cin >> di[i];
 96 
 97     fishing();
 98 
 99     cout << "最佳方案:" << endl;
100     for (int i = 1; i <= n; i++)
101         if (Lakes[i].max > Lakes[maxValues].max)
102             maxValues = i;
103 
104     cout << "钓鱼总数目:" << Lakes[maxValues].max << endl;
105 
106     // 输出在每个湖的钓鱼时间
107     for (int j = 1; j <= n; j++)
108         if (Lakes[maxValues].num[j] != 0)
109             cout << "在第" << j << "个湖总共停留了" << Lakes[maxValues].num[j] << "分钟。" << endl;
110 
111     system("pause");
112     return 0;
113 }

 

 

posted on 2021-05-10 22:52  Hrunjie  阅读(399)  评论(0编辑  收藏  举报

导航