poj1042(贪心算法)
题目大意:
约翰要去钓鱼。他有h小时可用(1 <= h <= 16),该区域有n个湖泊(2 <= n <= 25),可沿着一条单行道到达。约翰从1号湖出发,但他可以在任何他想
要的湖结束。他只能从一个湖到另一个湖,但他不需要在任何一个湖停下来,除非他愿意。对于每个i = 1,…n - 1,从i湖到湖i + 1的5分钟间隔为ti
(0 < ti <=192)。例如,t3 = 4意味着从3湖到4湖需要20分钟。为了帮助计划他的钓鱼之旅,约翰收集了一些关于湖泊的信息。对于每个湖i,预计在初
始5分钟内捕获的鱼的数量,表示fi(fi >= 0),已知。每5分钟的捕鱼减少了预期在接下来的5分钟内捕获的鱼的数量(di >= 0)。如果预期在间隔内捕获
的鱼数量少于或 等于di,那么在下一段时间内将不再有鱼留在湖中。为了简化计划,约翰假设没有人会在湖边钓鱼,以影响他想钓到的鱼的数量。
编写一个程序,帮助John计划他的钓鱼之旅,以最大限度地捕获被捕获的鱼的数量。在每个湖上花费的分钟数必须是5的倍数。
分析题目:
John要钓到最多的鱼,但是有n个湖,在湖之间位移还需要时间,所以John可能有n种最终停下的位置,我们要去比较这n种情况的钓鱼总数,选出最大
的,再输出结果。首先把总时间减去走到第p(p<=n)所需要的时间,那么剩余时间都是用来钓鱼的时间,假设John可以瞬间位移(因为位移时间已经减
去),John每次选择剩余最多鱼的湖去钓鱼,这样钓鱼的数目才会达到最多。
算法思想:
贪心算法,由于John可能在n个湖的任一个位置停下,所以我们要考虑n种情况,并选择出钓鱼总数最多的那种情况。每一种情况都贪心去能钓到最多
鱼的湖去钓鱼,若全部鱼都钓完了,就待在第一个湖(案例就是这样)。显然每一次贪心我们要去比较,选出剩余的鱼最多的湖钓鱼,钓完后,相应的
期望钓鱼数减少。
代码:
#include
include<stdio.h>
include<string.h>
using namespace std;
int n,m;
int f[30],d[30],leftyu[30],t[30],wait[30],tmp[30],maxz,max1;
void gengxin()
{
for(int i=0;i<n;i++)
wait[i]=tmp[i];
}
void diaoyu()
{
memset(wait,0,sizeof(wait));
maxz=-1;
int lushijian=0;
int yushijian=m;
for(int i=0;i<n;i++) //以i为最后一个池塘
{
max1=0;
memset(tmp,0,sizeof(tmp));
yushijian=m-lushijian;
for(int j=0;j<n;j++)
leftyu[j]=f[j];
while(true) //每次都找剩余鱼最多的池塘进行捕鱼
{
if(yushijian<5)
break;
int maxp=-1;
int lakeid;
for(int j=0;j<=i;j++)
{
if(leftyu[j]>maxp)
{
maxp=leftyu[j];
lakeid=j;
}
}
if(maxp0)
{
tmp[0]+=yushijian/5*5;
break;
}
tmp[lakeid]+=5;
max1+=leftyu[lakeid];
leftyu[lakeid]-=d[lakeid];
if(leftyu[lakeid]<0)
leftyu[lakeid]=0;
yushijian-=5;
}
if(max1>maxz) //如果以i为最后的池塘钓的鱼比以i-1为最后的池塘的鱼要多,则更新在每个池塘停留的时间
{
maxz=max1;
gengxin();
}
else if(max1maxz) //如果出现相同解
{
for(int j=0;j<n;j++)
{
if(tmp[j]<wait[j])
break;
if(tmp[j]>wait[j])
gengxin();
}
}
lushijian+=t[i]; //再路上花费的时间加t[i]
if(lushijian>m)
break;
}
cout<<wait[0];
for(int i=1;i<n;i++)
cout<<", "<<wait[i];
cout<<endl<<"Number of fish expected: "<<maxz<<endl<<endl;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
scanf("%d",&m);
m=60;
for(int i=0;i<n;i++)
scanf("%d",&f[i]);
for(int i=0;i<n;i++)
scanf("%d",&d[i]);
for(int i=0;i<n-1;i++)
{
scanf("%d",&t[i]);
t[i]=5;
}
diaoyu();
}
return 0;
}

浙公网安备 33010602011771号