这道题很是纠结啊!!!!说说思路吧!!先将所到湖的个数枚举,直接将走路时间减去,这样就可以贪心了,在枚举所选的湖个数的时候,那个湖鱼多久去那个湖,然后分别比较枚举的每种情况所抓鱼的数量,这样得出最大值!!!!
令我纠结好几个点的问题还不知这些!!题目的最后一句的意思是将除了走路捕鱼的剩余时间都放在有鱼的单位数最小的那个湖,譬如说如果3个湖鱼的情况为0 10 10,那就应该把剩余时间都放在第二个湖,课我就是wa,wa了后几个小时,最后干脆把所有剩余时间都放在第一个湖!!A了!!!我感觉狠诧异啊!!望读者留意帮我解答
#include<iostream>
using namespace std;
int fish[50],defish[50],detime[50],refish[50],tim[50],tim1[50];
int main()
{
int n,t,ret,ret1,cou=0;
while(cin>>n,n!=0)
{
cin>>t;
cou++;
int time=t*60;
int ti=time;
for(int i=0;i<n;i++)
{
scanf("%d",&fish[i]);//表示每个湖鱼的数量
refish[i]=fish[i];// 再用一个数组记录原始数量,后面枚举的时候用
}
for(int i=0;i<n;i++)
scanf("%d",&defish[i]);//记录每个湖鱼减少的数量
for(int i=1;i<n;i++)
scanf("%d",&detime[i]);//两湖之间所用的时间
detime[0]=0;
int temp=0;
int max1=-1;
for(int i=0;i<n;i++)//分别枚举从第一个湖到底i个湖的捕鱼情况
{
memset(tim,0,sizeof(tim));//记录每个湖捕鱼所用时间
time=ti;
for(int mi=0;mi<=i;mi++)
time=time-detime[mi]*5;//将走路的时间减去
ret=time;
int sum=0;
for(int j=0;j<n;j++)
fish[j]=refish[j];//这就是每次枚举还原每个湖鱼的数量
while(time>0)//开始捕鱼,直到将捕鱼时间用完
{
int sign1=0;
int max=0;
for(int j=0;j<=i;j++)//筛选出在所走的范围呢哪个湖鱼多就捕那个
{
if(fish[j]>max)
{
max=fish[j];
temp=j; //记录在哪个湖抓的鱼
sign1=1;
}
}
if(sign1==1)
tim[temp]+=5;
sum+=max;//将捕的鱼加起来
if(fish[temp]>0)
fish[temp]-=defish[temp];
time-=5;
}
if(sum>max1)//筛选每次枚举所获最多鱼的数量
{
ret1=ret;
max1=sum;
for(int j=0;j<n;j++)
tim1[j]=tim[j];
}
if(detime[i+1]==0)//很关键,如果消耗时间为零,就走不到下一个湖了
break;
}
int sum=0;
int i;
i=0;
for(int j=0;j<n;j++)//将剩余时间都放在第一个湖上
{
if(j==i)
continue;
sum+=tim1[j];
}
tim1[i]=ret1-sum;
for(int j=0;j<n;j++)
{
if(j==0)
cout<<tim1[j];
else
printf(", %d",tim1[j]);
}
cout<<endl;
printf("Number of fish expected: %d\n\n",max1);
}
return 0;
}