这题以前用Java做ACM的时候做过了..因为是按照分类做的,所以就用C++又写了一遍..
哎,还是新手啊,写过的题目还是写了蛮久...
假设人是可以瞬移的,每次都到鱼最多的湖里去钓鱼..
注意要对人最后停在哪一个湖分别考虑(人从起点到该湖的路程只用走一次).
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
struct lake{
int fi,di;
}la[30],te[30];
int ti[30];
int times[30];//临时储存时间
int besttime[30];//最佳方案的时间
int main(){
int lakes,t;//总湖数,总时间
while(scanf("%d",&lakes)&&lakes!=0){
memset(besttime,0,sizeof besttime);
scanf("%d",&t);
for(int i=0;i<lakes;i++){
scanf("%d",&la[i].fi);
}
for(int i=0;i<lakes;i++){
scanf("%d",&la[i].di);
}
ti[0]=0;
for(int i=1;i<lakes;i++){
scanf("%d",&ti[i]);
ti[i]=ti[i]+ti[i-1];
}
int fishs,maxfish=0;
t=t*60;
//对只到第i个湖的情况分别计算
for(int i=0;i<lakes;i++){
int rtime=t;
fishs=0;
rtime-=ti[i]*5;//先把走路的时间去掉
memset(times,0,sizeof(times));//时间清0
for(int j=0;j<lakes;j++){//初始化临时储存数组
te[j].fi=la[j].fi;
te[j].di=la[j].di;
}
while(rtime>0){
int maxindex=0;
for(int k=1;k<=i;k++){//找出鱼最多的池子
if(te[k].fi>te[maxindex].fi)maxindex=k;
}
if(te[maxindex].fi<=0){//没有湖有鱼了
times[0]+=rtime;
rtime=0;
}else{//处理这个湖中的鱼~
times[maxindex]+=5;
fishs+=te[maxindex].fi;
te[maxindex].fi-=te[maxindex].di;
rtime-=5;
}
}
if(fishs>maxfish){//大于时直接赋值给结果
maxfish=fishs;
for(int k=0;k<30;k++){
besttime[k]=times[k];
}
}
if(fishs==maxfish){//等于时比较第1个开始的湖所用的时间
for(int k=0;k<lakes;k++){
if(times[k]<besttime[k])break;
if(times[k]>besttime[k]){
maxfish=fishs;
for(int l=0;l<lakes;l++){
besttime[l]=times[l];
}
break;
}
}
}
}
for(int i=0;i<lakes;i++){
printf("%d",besttime[i]);
if(i!=lakes-1)printf(", ");
}
printf("\nNumber of fish expected: %d\n\n",maxfish);
}
return 0;
}