您的位置:首页 > 理论基础 > 数据结构算法

poj1042

2016-07-06 10:27 316 查看
Problem : Gone Fishing

Description:John要来一个钓鱼旅行历时h个小时,有n个湖,每个湖的起始鱼的数量为fi,每钓一次鱼减少的数量为di,ti表示John从第i个湖到第i+1个湖所花的时间,ti表示ti个5分钟,每次钓鱼Jhon花费5分钟,每次他都从第一个出发,并且按顺序去到各个湖,不重复路线。

Solution:贪心算法,枚举他最后到达的湖,用总时间减去走路花费的时间,剩下的时间贪心选择鱼的数量,再从枚举每个终点的数组中找出鱼的数量最多的那个。

Code(C++):

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
int n,h,i,j;
int rt,st;
int sum[30];
int f[30],d[30],t[30],fj[30];
int ft[30][30];
while(cin>>n,n)
{
cin>>h;
memset(sum,0,sizeof(sum));
memset(ft,0,sizeof(ft));
rt=h*12;
t[0]=0;
for(i=1; i<=n; i++)
cin>>f[i];
for(i=1; i<=n; i++)
cin>>d[i];
for(i=1; i<=n-1; i++)
cin>>t[i];
for(i=1; i<=n; i++)
{
int max;
int pos=0;
rt-=t[i-1];
st=rt;
for(j=1;j<=n;j++)
fj[j]=f[j];
while(st>0)
{
max=-1;
for(j=1; j<=i; j++)
{
if(fj[j]>max)
{
max=fj[j];
pos=j;
}
}
ft[i][pos]+=1;
if(fj[pos]<=d[pos])
fj[pos]=0;
else
fj[pos]-=d[pos];
st-=1;
sum[i]+=max;
}
}
int m=-1;
int k;
for(i=1; i<=n; i++)
{
if(sum[i]>m)
{
m=sum[i];
k=i;
}
}

for(i=1; i<n; i++)
{
cout<<ft[k][i]*5<<", ";
}
cout<<ft[k]
*5<<endl;
cout<<"Number of fish expected: "<<sum[k]<<endl;
cout<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息