1 /*
2 思路:
3 枚举 + 贪心
4 首先枚举只在前 i 个Lake钓鱼(1<=i<=n)
5 因为每段路上只走一次 那么总时间减去 从第一个Lake到第 i 个Lake
6 路上所花的时间 ,剩下的时间就是钓鱼所用的时间(这样就可以这样处理:
7 从一个Lake可以立即到另一个Lake)这就可以利用贪心 每次在 期待鱼最多的
8 Lake中钓鱼了
9 */
10 #include<iostream>
11 #include<cstdio>
12 #include<cstring>
13 using namespace std;
14
15 const int size = 26;
16
17 int fish[size];//记录每个湖前五分钟期待的可以得到的鱼的数目
18 int de[size];//每一个间隔鱼减少的数目
19 int tinum[size];//tinum[i]记录到达 第 i 个 lake 的时间间隔数目
20 int tempfish[size];//临时保存 每个 lake鱼的原值
21 int ftime[size];//记录最终 每个Lake所花的时间
22 int temptime[size];//临时存放 每个Lake所花时间的中间值
23
24 int slove(int m,int h,int n)
25 {
26 int i,j,total=0,ma;
27 memset(temptime,0,sizeof(temptime));
28 h*=12;//(12==60/5)
29 h-=tinum[m];//总时间减去到达 Lake m 的时间
30 while(h>0)
31 {
32 int ma=0;//从第一个开始搜所以 结果符合 尽量在前的要求
33 for(i=1;i<=m;++i)//每个时间段 都找期待值最大的湖钓鱼
34 {
35 if(tempfish[i]>ma)
36 {
37 ma=tempfish[i];
38 j=i;
39 }
40 }
41 if(ma<=0)
42 {
43 temptime[1]+=h;//所剩时间都加在 Lake 1上
44 break;
45 }
46 total+=tempfish[j];
47 tempfish[j]-=de[j];//这个湖的期待鱼减少
48 temptime[j]++;//在这个湖所花时间增加
49 h--;
50 }
51 return total;
52 }
53
54 int main()
55 {
56 int n,i,h,j;
57 while(scanf("%d",&n)&&n)
58 {
59 scanf("%d",&h);
60 for(i=1;i<=n;++i)
61 scanf("%d",&fish[i]);
62 for(i=1;i<=n;++i)
63 scanf("%d",&de[i]);
64 tinum[1]=0;
65 for(i=2;i<=n;++i)
66 {
67 scanf("%d",&tinum[i]);
68 tinum[i]+=tinum[i-1];
69 }
70 int sum=0,total;
71 for(i=1;i<=n;++i)
72 {
73 for(j=1;j<=n;++j)
74 tempfish[j]=fish[j];
75 total=slove(i,h,n);
76 if(total>sum)
77 {
78 sum=total;
79 for(j=1;j<=n;++j)
80 ftime[j]=temptime[j];
81 }
82 }
83 for(i=1;i<n;++i)
84 printf("%d, ",ftime[i]*5);
85 printf("%d\n",ftime[n]*5);
86 printf("Number of fish expected: %d\n\n",sum);
87 }
88 return 0;
89 }