POJ_1042_贪心
题目描述:
每组数据给你n个胡,h小时时间,每个湖一次可钓鱼数量,每个湖每次钓鱼后下次可钓鱼数量的减少量,从每个湖到下一个湖所需时间。求最大钓鱼量。
要注意的是,刚开始在第一个湖,每次移动只能往下一个湖移动,每次钓鱼数量最多可减少到0。
若多种情况钓鱼数量一样,则取前面的湖钓鱼次数最多的。
思路:
先把时间统一。
可以按跑了多少个湖分n种情况,也就是最后呆在哪个湖。
对于每一种情况,减去跑路的时间,总的钓鱼的时间是一样的,问题就变成了,怎么在跑过的湖分配时间,使效益最大。
贪心,每次取最大值,湖的状态更新之后,再取最大值......
一直到时间耗光,上面的值相加就是这种情况下的钓鱼最大数量。
然后每种情况取最大值便是最终答案,另外,每种情况还需要一个数组保存每个湖钓鱼次数。
最后要注意的是,钓鱼数量一样取前面的湖钓鱼次数最多的,若当前每个湖钓鱼数量均为0,可以直接把剩余时间全部投入第一个湖,结束此次过程。
#include<iostream> #include<cstdio> using namespace std; int n,h,t[26],f[26],d[26],ans[26]; int main() { while(cin >> n && n) { cin >> h; h = h*60; int i,j; for(i = 1;i <= n;i++) cin >> f[i]; for(i = 1;i <= n;i++) cin >> d[i]; for(i = 1;i < n;i++) cin >> t[i]; int sum = -1; for(i = 1;i <= n;i++) { int point,temp_h = h,temp_sum = 0,temp_f[26],temp_ans[26] = {0}; for(j = 1;j <= n;j++) temp_f[j] = f[j]; while(temp_h) { int maxf = 0; for(j = 1;j <= i;j++) { if(temp_f[j] > maxf) { maxf = temp_f[j]; point = j; } } if(maxf) { temp_ans[point] += 5; temp_sum += temp_f[point]; if(temp_f[point] >= d[point]) temp_f[point] -= d[point]; else temp_f[point] = 0; } else { temp_ans[1] += temp_h; break; } temp_h -= 5; } if(h > t[i]*5) { h -= t[i]*5; } else { h = 0; } if(temp_sum > sum) { for(j = 1;j <= n;j++) { ans[j] = temp_ans[j]; } sum = temp_sum; } } for(i= 1;i < n;i++) cout << ans[i] << ", "; cout << ans[n] << endl; cout << "Number of fish expected: " << sum << endl; cout<<endl; } return 0; }