//Memory 256kB Time 0ms 代码长度:1955B
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n,h;
struct lake{
int f;
int d;
};
int t[27];
lake l[27];
lake ll[27];
int tt[27];
int bestt[27];
int transTime[27];
int main(){
//freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
int fishingTime,temp,mark,numOfFish;
bool former = false;
while(scanf("%d",&n)&&n){
memset(t,0,sizeof(t));
memset(transTime,0,sizeof(transTime));
memset(ll,0,sizeof(ll));
scanf("%d",&h);
h *= 12;
for(int i = 1; i <= n; ++i){
scanf("%d",&ll[i].f);
}
for(int i = 1; i <= n; ++i){
scanf("%d",&ll[i].d);
}
for(int i = 1; i <= n-1; ++i){
scanf("%d",&t[i]);
}
t[0] = 0;
transTime[0] = 0;
int rec = -1;
for(int i = 1; i <= n; ++i){ //只在前i个湖里钓鱼
memset(tt,0,sizeof(tt));
numOfFish = 0;
memcpy(l,ll,sizeof(l));
transTime[i] = transTime[i-1] + t[i-1];//终点是第i个湖时在路上要花费的时间(/5min)
fishingTime = h - transTime[i];
while(fishingTime > 0){
temp =-1;
for(int j = 1; j <= i; ++j){
if(l[j].f > temp){
temp = l[j].f;
mark = j;
}
} //每次钓鱼前找到这个Interval里可以钓到的最多的鱼
numOfFish += temp;
fishingTime -= 1;
++tt[mark];
if(l[mark].f > l[mark].d){
l[mark].f -= l[mark].d;
}
else{
l[mark].f = 0;
}
} //end while
if(numOfFish> rec){
rec = numOfFish;
memcpy(bestt,tt,sizeof(tt));
}
else if(numOfFish == rec){
int k = 1;
while(k < n && tt[k] == bestt[k]){++k; }
if(tt[k] > bestt[k]){
for(int q = k ; q <= n; ++q){
bestt[q]=tt[q];
}
}
}
}
if(former){
printf("\n");
}
for(int i = 1; i <= n; ++i){
if(i != 1){
printf(", ");
}
printf("%d",bestt[i] * 5);
} // end for
printf("\n");
printf("Number of fish expected: %d\n",rec);
former = true;
}
return 0;
}
经典贪心+枚举:
1.枚举可以钓鱼的最后一个湖,把路上的时间减去;
2.John可以在不同的湖之间"瞬间转移",然后每一个interval选择可以钓上来最多鱼的湖;
3.注意每一次得到一个与之前相同的numOfFish,要得到字典序最大的各湖停留时间