Gone Fishing(枚举+贪心)

Gone Fishing

时间限制:3000 ms  |  内存限制:65535 KB
难度:5
描述
John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachable along a single, one-way road. John starts at lake 1, but he can finish at any lake he wants. He can only travel from one lake to the next one, but he does not have to stop at any lake unless he wishes to. For each i = 1,...,n - 1, the number of 5-minute intervals it takes to travel from lake i to lake i + 1 is denoted ti (0 < ti <=192). For example, t3 = 4 means that it takes 20 minutes to travel from lake 3 to lake 4. To help plan his fishing trip, John has gathered some information about the lakes. For each lake i, the number of fish expected to be caught in the initial 5 minutes, denoted fi( fi >= 0 ), is known. Each 5 minutes of fishing decreases the number of fish expected to be caught in the next 5-minute interval by a constant rate of di (di >= 0). If the number of fish expected to be caught in an interval is less than or equal to di , there will be no more fish left in the lake in the next interval. To simplify the planning, John assumes that no one else will be fishing at the lakes to affect the number of fish he expects to catch. 
Write a program to help John plan his fishing trip to maximize the number of fish expected to be caught. The number of minutes spent at each lake must be a multiple of 5. 
输入
You will be given a number of cases in the input. Each case starts with a line containing n. This is followed by a line containing h. Next, there is a line of n integers specifying fi (1 <= i <=n), then a line of n integers di (1 <=i <=n), and finally, a line of n - 1 integers ti (1 <=i <=n - 1). Input is terminated by a case in which n = 0. 
输出
For each test case, print the number of minutes spent at each lake, separated by commas, for the plan achieving the maximum number of fish expected to be caught (you should print the entire plan on one line even if it exceeds 80 characters). This is followed by a line containing the number of fish expected. 
If multiple plans exist, choose the one that spends as long as possible at lake 1, even if no fish are expected to be caught in some intervals. If there is still a tie, choose the one that spends as long as possible at lake 2, and so on. Insert a blank line between cases. 
样例输入


10 1 
2 5 



10 15 20 17 
0 3 4 3 
1 2 3 


10 15 50 30 
0 3 4 3 
1 2 3 

样例输出
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 

题意:去钓鱼,有n条湖按顺序排列,每条湖初始鱼量为fi,钓一个时间片就减少di条鱼,最小减到0条鱼,每条湖间的行走时间为ti个时间片(一个时间片为5分钟),给定时间h小时(一个小时12个时间片),要求最大的钓鱼数。

分析:1.难点在于走路的时间可多可少,应该话多少时间纯钓鱼比较好?解决方案就是——枚举最终停下来的湖,把其分为n中方案,这样每个方案走路时间就确定了,再在每个方案中求最优解,然后优中选优就行了。

2.那么如何在一个方案里找最优解呢?那么就先不要看顺序的找出到停下来的湖为止的湖中最大鱼量的湖。然后有效时间片th内找th次就行了。

3.注意如果有剩余时间,就把剩余时间加到第一条湖的时间上去。

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

const int N=25;
int n,h;
int f[N],d[N],t[N];//f第一个五分钟钓的鱼量,d为每个五分钟减少的鱼量,t为i到i+1五分钟的个数 
int ans;
int each[N];//记录最终每条湖用的时间
int tans,teach[N];//最优钓鱼量和各湖钓鱼时间 
int th,tf[N];//有效钓鱼时间和每条湖前五分钟的钓鱼量 

int main()
{
	int i,j;
	while(cin>>n&&n>0){//当湖的数量为0的时候结束 
		cin>>h;//输入时间 
		for(i=0;i<n;i++){
			cin>>f[i];//第一次的鱼量 
		} 
		for(i=0;i<n;i++){
			cin>>d[i];//每五分钟减少的鱼量 
		}
		for(i=0;i<n-1;i++){
			cin>>t[i];//每个湖间距离需要的时间片 
		}
		h*=12;//一小时12个时间片
		ans=-1;
		for(i=0;i<n;i++){//表示再第i条湖停下来 
			//初始化每一次贪心
			th=h;//有效时间先初始化为总时间 
			for(j=0;j<n;j++){
				tf[j]=f[j];//每条湖初始的钓鱼量初始为第一次五分钟的钓鱼量 
				teach[j]=0;//每个湖的钓鱼时间初始化为0 
			} 
			tans=0;//最大钓鱼数初始化为0 
			
			//对每五分钟贪心选择钓鱼量最大的湖钓鱼 
			while(th>0){//当有效时间大于0 
				int ind=0,max=tf[0];//令第一条湖的鱼量为最大值 ,ind标记湖是第几条湖 
				for(j=0;j<=i;j++){
					if(tf[j]>max){//不考虑顺序先找第一次鱼量最大的湖 
						max=tf[j];
						ind=j;
					}
				}
				if(max==0){//最大钓鱼量为0时,将剩余的钓鱼时间加到第一个湖上的钓鱼时间 
					teach[0]+=th*5;//例如样例一 
					break;
				}
				else{
					teach[ind]+=5;//最大湖的钓鱼时间,每钓一次加一次五 
					tans+=tf[ind];//加上最大鱼量的湖的该次的鱼数 
					if(tf[ind]>=d[ind])//如果鱼量不少于减少的鱼数 ,则减 
					{
						tf[ind]-=d[ind];
					}
					else{
						tf[ind]=0;//小于减少数则赋值为0 
					}
				} 
				th--;//有效时间减少一个时间片(一个时间片五分钟) 
			}
			if(i!=n-1){//i的话是表示在第i条湖停下来 
				h-=t[i];//减去到下一条湖的时间片 
			}
			if(tans>ans){//如果值大于前面的值,就把值赋给ans 
				ans=tans;
				for(j=0;j<n;j++){
					each[j]=teach[j];//记录最终每条湖用的时间 
				}
			}
		} 
		cout<<each[0]; 
		for(i=1;i<n;i++){
			cout<<", "<<each[i];
		}
		cout<<endl;
		cout<<"Number of fish expected: "<<ans<<endl;
		cout<<endl;
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_42105789/article/details/84546555
今日推荐