poj 1042 贪心

题意:有n个湖,每个湖有一个初始的鱼量Fi,每个湖中鱼的数量会以di的速率不断下降,未到的湖其鱼量不变。这n个湖排成一排,只能从标号小的湖走向标号大的湖。从第一个湖开始每个单位时间可以选择钓鱼或者往下一个湖走。给定总时间h,问最多能钓到多少鱼。
思路:枚举经过的湖的数量。在每种湖数量给定的情况下,贪心选鱼。即选择能钓到最多鱼的湖。

#include <stdio.h>
#include <string.h>
#define N 26
int f[N],F[N];//F数组为每个湖中原始的鱼的数量
int d[N];//d数组为每个湖每隔5分钟减少的鱼的数量
int t[N];//t[i]为从i-1个湖走到第i个湖所需的时间
int res[N],RES[N];//保存结果,即第i个湖钓多长时间
int n,h,H,end,max,sum;
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d",&n)&&n){
		int i,j;
		memset(RES,0,sizeof(RES));
		max = 0;
		scanf("%d",&H);
		H *= 12;//题意都是以5分钟为单位,这里转化成每单位
		RES[0] = H;//赋予初值(有可能每个湖里都没有鱼,此时时间都用在第一个湖上)
		for(i = 0;i<n;i++)
			scanf("%d",&F[i]);
		for(i = 0;i<n;i++)
			scanf("%d",&d[i]);
		for(i = 1;i<n;i++)
			scanf("%d",&t[i]);

		for(end = 0;end<n;end++){
			//表示从第1个湖到第k个湖捕鱼(为k时表示k个湖都会达到)
			h = H;
			sum = 0;
			memset(res,0,sizeof(res));
			for(i = 1;i<=end;i++)//先把途中用到的时间刨去,只对捕鱼的时间贪心运算
				h -= t[i];
			for(i = 0;i<=end;i++)
				f[i] = F[i];
			if(h <= 0)
				break;
			while(h--){//如果有时间,就从鱼的数量最多的那个湖中打渔。
				for(i = 1,j = 0;i<=end;i++)
					if(f[i] > f[j])
						j = i;
				sum += f[j];//记录总的打渔数量
				f[j] -= d[j];//鱼的数量的变化
				f[j] = f[j]<0?0:f[j];
				res[j] ++;
			}
			if(sum > max){
				max = sum;
				for(i = 0;i<=end;i++)
					RES[i] = res[i];
			}
		}
		for(i = 0;i<n-1;i++)
			printf("%d, ",RES[i]*5);
		printf("%d\n",RES[n-1]*5);
		printf("Number of fish expected: %d\n\n",max);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值