题意:有n个池塘,一个人有h小时的空闲时间,每个池塘有f条鱼,如果在这个池塘开始钓鱼就会每5分钟少d条,然后是n-1个数,表明从一个池塘到下一个池塘的时间的间隔,一个时间单位是5分钟,要求输出一个人在空闲时间内能钓到的最大数量的鱼和在每个池塘待的时间,如果数量相同,前面池塘待的时间长的先输出。
题解:先确定去几个池塘(从1到n),把从一个池塘到另一个的时间减掉,然后在每个单位时间内选出此时池塘内鱼的数量最多的加起来,更新最大值,如果和最大的一样大,注意比较选出池塘靠前的时间多的那一种情况。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 30;
struct Lake {
int f, d, time;
}lake[N];
int main() {
int h, n, cases = 0, maxx, t[N], temp2[N], con[N];
while (scanf("%d", &n) && n) {
if (cases)
printf("\n");
cases++;
for (int i = 0; i < N; i++) {
con[i] = 0;
lake[i].time = 0;
}
scanf("%d", &h);
h *= 12;
for (int i = 0; i < n; i++)
scanf("%d", &lake[i].f);
for (int i = 0; i < n; i++)
scanf("%d", &lake[i].d);
t[0] = 0;
for (int i = 1; i < n; i++) {
scanf("%d", &t[i]);
t[i] += t[i - 1];
}
int sum = 0, temp = h;
maxx = 0;
for (int i = 0; i < n; i++) {
temp = h - t[i];
sum = 0;
for (int j = 0; j <= i; j++) {
temp2[j] = lake[j].f;
lake[j].time = 0;
}
if (temp <= 0)
break;
while (temp--) {
int id = 0, sum1 = 0;
for (int j = 0; j <= i; j++) {
if (sum1 < temp2[j]) {
sum1 = temp2[j];
id = j;
}
}
if (sum1 <= 0) {
lake[0].time += temp + 1;
break;
}
sum += sum1;
temp2[id] -= lake[id].d;
lake[id].time++;
}
if (sum > maxx) {
maxx = sum;
for (int j = 0; j <= i; j++)
con[j] = lake[j].time;
}
else if (sum == maxx) {
for (int j = 0; j < n; j++) {
if (con[j] > lake[j].time)
break;
if (lake[j].time > con[j]) {
for (int k = 0; k < n; k++)
con[j] = lake[j].time;
break;
}
}
}
}
printf("%d", con[0] * 5);
for (int i = 1; i < n; i++)
printf(", %d", con[i] * 5);
printf("\nNumber of fish expected: %d\n", maxx);
}
return 0;
}