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 }