poj1042
题目大意:
有n个湖,一个人在这些湖中钓鱼,5分钟钓一次,求给定的时间内能够钓的鱼的最大数量,他的起点是第一个湖泊,可以在任意湖泊终止
但是只能够往下走,不能返回,每次钓到的鱼会在上一次的基础上减少,当所有的湖泊里的鱼能够钓的数量为0时,但是时间还有剩,都算到第
一个湖泊上
输出在每一个湖泊呆的时间,及最大钓鱼数量
思路:
枚举+贪心
一一枚举所经过的湖泊,算出该情况的最优解,具体看代码
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int N = 30;//湖的最大数目 const int M = 200;//钓鱼的最大次数,题目所给16小时,5分钟一单位,16*12 //time[i]代表在第i个湖钓鱼的次数,fish[i][j]在第i个湖第j次钓鱼的数量 int time[N],fish[N][M]; int movetime[N];//movetime[1]=0,movetime[i]代表从第i-1个湖移动到第i个湖所需时间 int d[N];//每隔一次钓鱼当再一次钓鱼时减少的数量 int n,h; int main() { //freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF&&n) { int ans = 0; memset(time,0,sizeof(time)); memset(movetime,0,sizeof(movetime)); memset(fish,0,sizeof(fish)); scanf("%d",&h); for(int i=1;i<=n;i++) scanf("%d",&fish[i][1]); for(int i=1;i<=n;i++) scanf("%d",&d[i]); for(int i=2;i<=n;i++) scanf("%d",&movetime[i]); int totalTime = h*12; time[1]=totalTime;//全0的情况,也就是不会钓到鱼,把所有的时间都花在第一个湖 //初始化每个湖每次钓鱼的数量 for(int i=1;i<=n;i++) for(int j=2;j<=totalTime;j++) fish[i][j]=max(fish[i][j-1]-d[i],0);//不可能是负数 //枚举所有情况,即只在一个湖,两个湖.....n个湖能够钓到最多的鱼 for(int k=1;k<=n;k++) { int maxFish = 0; //计算能够钓鱼的时间,就是减掉移动的时间 int realTime=totalTime; for(int i=2;i<=k;i++) realTime-=movetime[i]; if(realTime<=0) break;//总时间不够耗在路程上时,跳出 //用来临时记录每个湖的钓鱼次数 int temp[N];memset(temp,0,sizeof(temp)); for(int tt=1;tt<=realTime;tt++) { //找出每次钓鱼能够最多数量的湖 //如果所有的湖的鱼都是0的话,那么就把时间加在第一个湖,p=1; int maxs = 0 , p=1; for(int i=1;i<=k;i++) if(fish[i][temp[i]+1]>maxs) { maxs = fish[i][temp[i]+1]; p=i; } maxFish+=maxs; temp[p]++; } //更新最大值情况 if(maxFish>ans) { ans=maxFish; memcpy(time,temp,sizeof(temp)); } } printf("%d",time[1]*5); for(int i=2;i<=n;i++) printf(", %d",time[i]*5); printf("\nNumber of fish expected: %d\n\n",ans); } }