poj1042

贪心+枚举

首先总时间减去到达第i个湖时所需要的时间(t1+t2+...+ti),然后认为,钓鱼的人可以在这i个湖之间,瞬间移动。

每次都去鱼最多的湖钓(鱼数相同时,去湖的编号小的湖钓),保证了可以钓到最多的鱼。(注意细节,当鱼数<di时,下次就没有了,fi要置为0)

枚举1<=i<=n,取结果最大的方案(用一个数组保存方案)。

#include<iostream>
using namespace std;
int n,h,f[30],d[30],t[30];
int Time[30],tL[30];
int F[30];
int Max(int end)
{
	int MAX=F[1],k=1;
	for(int i=1;i<=end;i++)
		if(F[i]>MAX) {MAX=F[i];k=i;}
	return k;
}
int work(int end,int total)
{
	int now=0;
	memset(Time,0,sizeof(Time));
    memset(F,0,sizeof(F));
	for(int i=1;i<=end;i++)
		F[i]=f[i];
	while(total)
	{
		int k;
		k=Max(end);
		now+=F[k];
		F[k]-=d[k];
		if(F[k]<0) F[k]=0;
		Time[k]+=5;
        total-=5;
	}
	return now;
}
int main()
{
	int i,j;
	int total;
	int time[30];
	while(cin>>n&&n)
	{
		int ans=-1;
		cin>>h;
		total=h*60;
		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];
			tL[i]=tL[i-1]+5*t[i-1];
		} 
		tL[n]=tL[n-1]+5*t[n-1];
		for(i=1;i<=n;i++)	
		{
			if(total>=tL[i])
			{
		    	int now=work(i,total-tL[i]);
		    	if(now>ans)
				{
					ans=now;
					for(j=1;j<=n;j++)
						time[j]=Time[j];
				}
			}
			else break;
		}
		for(i=1;i<=n-1;i++)
			cout<<time[i]<<", ";
		cout<<time[n]<<endl;
		cout<<"Number of fish expected: "<<ans<<endl;
		cout<<endl;
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值