题意:
John去钓鱼,在一个单向的很多条湖的路边钓鱼,每条湖每5分钟能钓到的鱼的数量随着时间减少,每条湖之间的行走时间也是不同的,但是固定不变。问的是,给出总的时间h小时,编写算法,求出能钓到最多的鱼的解决方案。
输入:湖的数量,给定的总时间,每条湖头5分钟能钓到的数量,每条湖钓鱼的衰减速率,每两条湖之间的行走时间
输出:每条湖上 钓鱼的时间,以及最大的钓鱼的数量
分析:枚举算法 加上 贪心算法
首先,无论选择哪种方案,最后John肯定会有一条最后钓鱼的湖。所以,最终方案肯定是以下方案的一个:在第i条湖收工(i=1,2,3,4……n).
以上是枚举,枚举中每一种情况之后,再看看下一个5分钟,哪一条湖能钓的鱼最多,就选择哪条湖,“瞬间转移”,这样持续下去,直到把时间耗尽
这就是贪心算法,每次选择最优的方案。
如果出现负数,时间全部累加到 第一条湖 上;当出现钓鱼最多的方案有多个时,将前几个湖中耗时最长的找出来就可以了。
最后要注意的是,输出格式。(一个空格花了我好久才AC)
#include<iostream>
#include<cstring>
#define MAX 26
using namespace std;
int t[MAX],f[MAX],F[MAX],d[MAX],ans[MAX],ANS[MAX]; //ANS为最终在每条湖上的停留时间
int main(){
int i,j,k,h,time,n,p,sum,max;
memset(t,0,sizeof(t));
while(cin>>n&&n!=0){
cin>>h;
h = h * 12;
for(i=0;i<n;i++)
cin>>F[i];
for(i=0;i<n;i++)
cin>>d[i];
for(i=1;i<n;i++){
cin>>time;
t[i] = time + t[i-1];
}
memset(ANS,0,sizeof(ANS));
for(max=0,i=1;i<=n;i++){
memset(ans,0,sizeof(ans));
for(k=0;k<i;k++)
f[k] = F[k];
for(sum=0,j=0;j<h-t[i-1];j++){
for(p=0,k=1;k<i;k++){
if(f[k]>f[p])
p = k;
}
if(f[p]<=0){
ans[0]+= h - t[i-1] - j;
break;
}
sum += f[p];
f[p] -= d[p];
ans[p]++;
}
if(sum>max){
max = sum;
memcpy(ANS,ans,sizeof(ans));
}
if(sum == max){
for(j=0;j<i;j++){
if(ans[j]!=ANS[j])
break;
}
if(ans[j]>ANS[j]){
memcpy(ANS,ans,sizeof(ans));
}
}
}
for(i=0;i<n;i++){
if(i==n-1){
cout<<ANS[i]*5<<endl;
break;
}
cout<<ANS[i]*5<<", ";
}
cout<<"Number of fish expected: "<<max<<endl<<endl;
}
return 0;
}