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

Gone Fishing

2014年01月12日 ⁄ 综合 ⁄ 共 3388字 ⁄ 字号 评论关闭

Gone Fishing

Time Limit: 2000MS   Memory Limit: 32768K
Total Submissions: 21189   Accepted: 6030

Description

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.

Input

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.

Output

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.

Sample Input

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 

Sample Output

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 
http://poj.org/problem?id=1042
 
这道题我是用贪心算法+枚举完成的,先举个例子,假如在湖n终止钓鱼,可以在总时间中除去行走时间,这时候
只剩钓鱼时间,然后遍历各湖当前5分钟的鱼数,取最大值,进行钓鱼,重复这个贪心过程,求的湖n终止时的最大湖数。
因为不知道在哪一个湖终止,所以枚举所停止的湖即可。这道题提交时不断提示超时,最后通过删去while的循环--restime(剩余时间),改成在循环体内--restime,就通过了。
 
#include <cstdio>
#include <algorithm>

int times,n;//总时间,湖
int restime;//剩余时间
int f[25],curf[25];//湖一从0开始,初始鱼数和当前鱼数
int t,ti[25],di[25];//临时变量,。。。
int fish,fishtmp;//最大总钓鱼数,临时量
int ans[25][25];//时间分配,临时量
int i,k;
int laken=0;

int solve()
{
	for (i=0;i<n;++i)
	{
		fishtmp=0;
		memcpy(curf,f,sizeof(f));
		restime=times-ti[i];
		while(restime>=1)
		{
			int maxl=0;
			for (k=0;k<=i;++k)
				if (curf[k]>curf[maxl])
					maxl=k;
			if (curf[maxl]==0)
			{
				ans[i][0]+=restime;
				break;
			}
			++ans[i][maxl];
			fishtmp+=curf[maxl];
			curf[maxl]-=di[maxl];
			if (curf[maxl]<0)
				curf[maxl]=0;
			--restime;
		}
		if (fishtmp==fish)
		{
			for (k=0;k<=i;++k)
			{
				if (ans[laken][k]>ans[i][k])
					break;
				if (ans[laken][k]<ans[i][k])
				{
					laken=i;
					break;
				}
			}
		}
		if (fishtmp>fish)
		{
			fish=fishtmp;
			laken=i;
		}
	}
	return 0;
}

int main()
{
	ti[0]=0;
	while (scanf("%d",&n)!=EOF&&n>0)
	{
		fish=0;
		scanf("%d",×);
		times*=12;
		memset(ans,0,sizeof(ans));
		for (i=0;i<n;++i)
			scanf("%d",&f[i]);
		for (i=0;i<n;++i)
			scanf("%d",&di[i]);
		for (i=1;i<n;++i)
		{
			scanf("%d",&t);
			ti[i]=ti[i-1]+t;
		}
		solve();
		static int cs = 0;
		printf ("%s", cs++ ? "\n" : "");
		for (int i=0; i<n; ++i) {
			printf (i==n-1 ? "%d\n" : "%d, ", ans[laken][i]*5);
		}
		printf ("Number of fish expected: %d\n", fish);

	}
	return 0;
}

抱歉!评论已关闭.