现在的位置: 首页 > 综合 > 正文

POJ-1042:Gone Fishing

2018年04月29日 ⁄ 综合 ⁄ 共 3133字 ⁄ 字号 评论关闭

时间限制: 
2000ms 
内存限制: 
65536kB
描述
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.
样例输入
2
1
10 1
2 5
2
4
4
10 15 20 17
0 3 4 3
1 2 3
4
4
10 15 50 30
0 3 4 3
1 2 3
0
样例输出
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

这一道【枚举】+【贪心】的题目,首先第一个思考的点是,枚举什么?这道题中枚举一共经过  多少 个湖。第二贪心什么?此题贪心每个湖当前状态下钓鱼5分钟能捕到的鱼的数量,那么第一个5分钟可能在1号湖,第二个5分钟却可能在13号湖,那么是不是就要马上走到13号湖呢?这是这道题得巧妙点,这时并不需要马上到达13号湖,而是采用记账,记下13号应该钓鱼5分钟,等将来到达13号湖的时候再执行。

解法:

#include <iostream>
using namespace std;

void display(int *arr,int n)
{
	for(int i=0; i<n;++i)
	{	
		cout<<arr[i]*5;	
		if(i!=n-1)
			cout<<", ";
	}
	cout<<endl;
}

int max(int *arr,int n)
{
	int max_pos =0;
	for(int i=1; i<n; ++i)
	{	if(arr[max_pos]<arr[i])
			max_pos = i;
	}
	return max_pos;
}

int main()
{
	int n; cin>>n;
	while(n)
	{

		int h; cin>>h;
		int fsh[25] = {};
		int dec[25] = {}; 
		int trv[25] = {};
		for(int i=0; i<n; ++i)
		{	cin>>fsh[i];	}
		for(int i=0; i<n; ++i)
		{	cin>>dec[i];	}
		for(int i=0; i<n-1; ++i)
		{	cin>>trv[i];	}


		/*calculate the result*/
		int spend [25][25] = {};
		int fishes[25]    = {}; /*捕了多少鱼*/

		/*枚举一共经过的湖的数量,从0到n-1个*/
		for(int i=0;i<n;++i)
		{	
			/*最远到达i号湖最大的捕鱼量*/
			int intervals = h*12;
			for(int j=0; j<i; ++j)
			{	intervals -= trv[j];}

			for(int j=0;j<intervals;++j)
			{	
				int max  = fsh[0]-spend[i][0]*dec[0];
				if(max<0)max = 0;
				int lake = 0;
				for(int j=0; j<=i; ++j)
				{	
					int tmp = fsh[j]-spend[i][j]*dec[j];
					if(tmp<0){	tmp=0;	}
					if(max < tmp)
					{	
						max  = tmp;
						lake = j;
					}
				}
				spend[i][lake]++;
				fishes[i] += max;
			}	
		}

	
		int lakes = max(fishes,n);
		display(spend[lakes],n);
		cout<<"Number of fish expected: "
			 <<fishes[lakes]<<endl<<endl;

		cin>>n;
	}
	return 0;
}

抱歉!评论已关闭.