钓鱼问题(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 }