poj 1042 gone fishing

这个题目是标准的贪心算法。题目的大体意思就是,现在给你一些水塘现在这个小孩在池塘1,现在开始钓鱼,刚开始每个池塘有一定数目的鱼,每次钓鱼5分钟鱼的数目会相应的减少,当池塘当前的鱼-每钓一次减少的数目<=0的时候下次将钓不到鱼,当然池塘与池塘之间是有一定间隔的,这个间隔体现在时间上就是从i到i+1所花费的时间是ti当然这个ti*5才是真正的时间了。现在给你这个小孩能钓鱼的时间求他最多能钓多少鱼,并且要求输出在每个池塘停留的时间。这个题目的做法就是如果我们知道了最后是在哪个池塘停止钓鱼的,然后当然我们是一次走过去不会从i号池塘往回走,其余的时间全部都用来钓鱼。现在的问题就是怎么安排在这几个池塘的钓鱼时间,当然我们先是选择出前5分钟鱼最多的池塘钓,然后这个池塘的鱼减掉每次减少的鱼的数目,然后下一个5分钟继续这种做法。要注意题目的输出有个要求,导致必须要把最后停滞在第一个湖的这种情况单独进行计算。还有这个题目隐含了一个意思,这些时间必须全部都耗尽,即使已经没有鱼可钓。

下面看程序。

#include<iostream>
#include<stdio.h>
using namespace std;
int start[26],change[26],stay[26],compare[26],de[26],dis[26];
int main()
{
	int n,h,i,time,sum,used,flag,maxi,j,jilu,sumc;
	while(cin>>n)
	{
		if(n==0)
			break;
		cin>>h;
		h=h*60;
		for(i=1;i<=n;i++)
			scanf("%d",&start[i]);
		start[0]=0;
		for(i=1;i<=n;i++)
			scanf("%d",&de[i]);
		for(i=1;i<n;i++)
		{
			scanf("%d",&dis[i]);
			dis[i]=5*dis[i];
		}
		dis[0]=0;
		for(i=1;i<=n;i++)
			stay[i]=0;
		sum=0;
		time=h;
		change[1]=start[1];
		for(i=1;i<=n;i++)
			stay[i]=0;
		while(time>0)
		{
			sum=sum+change[1];
			change[1]=change[1]-de[1];
			if(change[1]<0)
				change[1]=0;
			time=time-5;
			stay[1]=stay[1]+5;
		}
		used=0;
		for(i=2;i<=n;i++)
		{
			sumc=0;
			used=used+dis[i-1];
			time=h-used;
			flag=1;
			for(j=1;j<=n;j++)
			{
				change[j]=start[j];
				compare[j]=0;
			}
			while(time>0)
			{
				maxi=0;
				jilu=1;
				for(j=1;j<=i;j++)
				{
					if(change[j]>maxi)
					{
						maxi=change[j];
						jilu=j;
					}
				}
				sumc=sumc+maxi;
				change[jilu]=change[jilu]-de[jilu];
				compare[jilu]=compare[jilu]+5;
				if(change[jilu]<0)
					change[jilu]=0;
				time=time-5;
			}
			if(sumc>sum)
			{
				sum=sumc;
				for(int k=1;k<=n;k++)
					stay[k]=compare[k];
			}
		}
		for(i=1;i<n;i++)
			cout<<stay[i]<<", ";
		cout<<stay[n]<<endl;
		cout<<"Number of fish expected: "<<sum<<endl<<endl;
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值