NYOJ 30

View Code
 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 }

 

posted @ 2012-05-11 15:43  知行执行  阅读(147)  评论(0编辑  收藏  举报