1859: Gone Fishing
题目链接
题意:给出很多个鱼塘,告诉你每个鱼塘的初始鱼的数量,还有每个鱼 塘每五分钟鱼游走的鱼的数量以及每五分钟能够钓到的鱼的数量。 每个鱼塘之间有距离。然后问在一定时间内,能够最多能钓鱼多 少只,并且把在每个鱼塘停留钓鱼的时间输出,而且要求在第一 个鱼塘尽量呆的久。
分析:贪心,如果我们已经确定在号鱼塘内钓鱼,事先减去再 路上花费的时间。那么我们就不用管钓鱼的前后关系了。即先去 号鱼塘钓鱼,再去号鱼塘钓鱼,再去号鱼塘钓鱼这些路上的 时间不用再计算了。相当于可以随便钓,然后问最多钓多少鱼。 很显然,我们用贪心思想,每次取当前能够钓鱼数量最多的那个 鱼塘即可。
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<math.h>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int n,h;
int f[30];
int tmp_f[30];
int t[30];//岛与岛之间之间花费的时间
int d[30];//每呆单位时间鱼减掉的数目
int rec[30],rec_tmp[30];
int main ()
{
int flag=0;
while (scanf ("%d",&n)){
if (n==0)break;
if (flag)printf ("\n");
else flag=1;
int ans=0;
scanf ("%d",&h);
h*=12;//总时间
for (int i=1;i<=n;i++){
scanf ("%d",&f[i]);
tmp_f[i]=f[i];
}
for (int i=1;i<=n;i++){
scanf ("%d",&d[i]);
}
t[0]=0;
for (int i=1;i<=n-1;i++){
scanf ("%d",&t[i]);
t[i]+=t[i-1];//求到达第i+1个岛在路上花费的总时间
}
for (int i=1;i<=n;i++){
//走到第i个岛,先将路上的时间给减掉,然后剩下的就是可以在岛屿上呆的时间
int tt=h-t[i-1];
//cout<<"tt="<<tt<<endl;
if(tt<0)break;
memset(rec_tmp,0,sizeof (rec_tmp));
int ans1=0;
int Max=0,place=1;
for (int j=1;j<=n;j++) tmp_f[j]=f[j];//每次从新赋值原始的鱼的数量
for (int k=0;k<tt;k++){
Max=0;place=1;//在前i个岛中找到能钓到最多的鱼
for (int j=1;j<=i;j++){
if (Max<tmp_f[j]){
Max=tmp_f[j];
place=j;
}
}
ans1+=Max;//总数加上
tmp_f[place]-=d[place];//然后这个岛能钓到的鱼减掉d
rec_tmp[place]++;//在岛呆的时间加一
if (tmp_f[place]<0)tmp_f[place]=0; //如果小于0说哦名下次钓不到鱼,置零
}
if (ans1>ans){
ans=ans1;
for (int j=1;j<=n;j++){//保存在每个岛呆的时间
rec[j]=rec_tmp[j];
}
}
}
for (int i=1;i<=n;i++){
if (i==1)printf ("%d",rec[i]*5);
else printf (", %d",rec[i]*5);
}
printf ("\n");
printf ("Number of fish expected: %d\n",ans);
}
return 0;
}