您的位置:首页 > 编程语言 > Go语言

poj 1042 Gone Fishing

2013-07-25 14:43 274 查看
题目链接:http://poj.org/problem?id=1042

题目大意:

有n个湖(1~n),有h个小时的时间。从湖1出发,有选择的在一些湖边停留钓鱼,最后在某一个湖边结束。从第i个湖到第i+1个湖需要走5*Ti分钟,同时在i湖边停留,第一个5分钟可以钓鱼Fi,以后每个5分钟减少Di。求能钓到最多鱼的方法;

思路:

用贪心,每次选一个鱼最多的湖泊钓一次鱼。对于每个湖来说,由于在任何时候鱼的数目之和在该湖里钓鱼的次数有关,和钓鱼总次数无关,所以这个策略是最优的。

#include<iostream>
using namespace std;
int ans[30][30];
int  main()
{
int n,h,time,k;
int i,j;
while(~scanf("%d",&n)&&n)
{
int d[30]={0};
int t[30]={0};
int f[30]={0};
int fs[30];
scanf("%d",&h);
h*=12;
for(i=0;i<n;i++)
scanf("%d",&f[i]);
for(i=0;i<n;i++)
scanf("%d",&d[i]);
for(i=1;i<n;i++)
scanf("%d",&t[i]);
memset(ans,0,sizeof(ans));
//贪心
for(i=1;i<=n;i++)//在前i个湖里面找鱼最多的钓
{
for(j=0;j<i;j++) fs[j]=f[j];
int flag=0;
h-=t[i-1];
time=h;
//每次找鱼最多的钓知道时间用完或湖里鱼钓完
while(time>0 && flag!=i)
{
k=0;
for(j=1;j<i;j++)
{
if(fs[j]>fs[k])
k=j;
}

ans[i][0]+=fs[k];
ans[i][k+1]++;
time--;
if(fs[k]>0)
{
fs[k]-=d[k];
if(fs[k]<0) fs[k]=0;
}
flag=0;
for(j=0;j<i;j++)
{
if(fs[j]<=0)
flag++;
}

}
//将剩余时间加到一个湖中用时
ans[i][1]+=time;
}
k=1;
for(j=2;j<=n;j++)
{
if(ans[j][0]>ans[k][0]) k=j;
}
for(j=1;j<=n;j++)
{
printf("%d",5*ans[k][j]);
if(j!=n)
printf(", ");
}
printf("\n");
printf("Number of fish expected: %d\n\n",ans[k][0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: