POJ 1042 Gone Fishing#贪心
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1042 Gone Fishing#贪心相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=30; int n,h,H;//H:记录原本有多少小时的时间;h:贪心的时候,防止H被修改 int res[N],RES[N];//res[]:贪心的时候保存结果;RES[]:用于记录最终结果 int maxn,sum;//maxn:保存最终结果,即捕到的鱼最大值;sum:每轮贪心的时候,用来保存鱼最大值 struct ff { int f,d,t;//f:第i个湖里原本有的鱼数,d:第i个湖被捕过之后的鱼数,t:从第i-1到第i个湖需要的时间 }; ff f[N],F[N]; int main() { while(scanf("%d",&n)&&n) { memset(RES,0,sizeof(RES)); maxn=0; scanf("%d",&H); H*=12; //以5min为单位,输出结果的时候,记得乘以5 RES[0]=H;//赋初值H,因为有可能1……n-1湖都没有鱼,时间就都花在第一个湖了 for(int i=0;i<n;i++) scanf("%d",&F[i].f); for(int i=0;i<n;i++) scanf("%d",&F[i].d); for(int i=1;i<n;i++) scanf("%d",&F[i].t); for(int k=0;k<n;k++) {//在第0到第k个湖之间捕鱼 h=H; sum=0; memset(res,0,sizeof(res)); for(int i=0;i<n;i++) f[i].f=F[i].f;//避免F[]被修改 for(int i=1;i<=k;i++) h-=F[i].t; //把到第k个湖之前所用的时间全部减去,剩下的时间来捕鱼 if(h<=0) break; while(h--) {//只要有时间,每次都去鱼最多的湖抓鱼(贪心) int index=0; for(int i=1;i<=k;i++) if(f[i].f>f[index].f) index=i; sum+=f[index].f; f[index].f-=F[index].d;//第index个湖被捕之后,就会少掉d条鱼,要更新f[].f值 if(f[index].f<0) f[index].f=0;//还要注意避免负值 res[index]++;//只要在第index个湖捕鱼,那么在第index个湖就花去了时间1(单位为/5min) } if(sum>maxn) {//更新最大值maxn,找到最优的状态,把数据记录在RES[]中,因为res[]会清零并用于下一轮的记录 maxn=sum; for(int i=0;i<=k;i++) RES[i]=res[i]; } } for(int i=0;i<n-1;i++) printf("%d, ",RES[i]*5);//记得*5 printf("%d\n",RES[n-1]*5);//记得*5 printf("Number of fish expected: %d\n\n",maxn); } return 0; }
以上是关于POJ 1042 Gone Fishing#贪心的主要内容,如果未能解决你的问题,请参考以下文章