poj 1042Gone Fishing

 
 
//Memory 256kB   Time 0ms 代码长度:1955B
 
 
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<algorithm>
#include<string.h>

using namespace std;
int n,h;
struct lake{
	int f;
	int d;
};
int t[27];
lake l[27];
lake ll[27];
int tt[27];
int bestt[27];
int transTime[27];
int main(){
	//freopen("1.txt","r",stdin);
//	freopen("2.txt","w",stdout);
	int fishingTime,temp,mark,numOfFish;
	bool former = false;
	while(scanf("%d",&n)&&n){
		memset(t,0,sizeof(t));
		memset(transTime,0,sizeof(transTime));
		memset(ll,0,sizeof(ll));
		scanf("%d",&h);
		h *= 12;
		for(int i = 1; i <= n; ++i){
			scanf("%d",&ll[i].f);
		}
		for(int i = 1; i <= n; ++i){
			scanf("%d",&ll[i].d);
		}
		for(int i = 1; i <= n-1; ++i){
			scanf("%d",&t[i]);
		}
		t[0] = 0;
		transTime[0] = 0;
		int rec = -1;
		for(int i = 1; i <= n; ++i){  //只在前i个湖里钓鱼
			memset(tt,0,sizeof(tt));
			numOfFish = 0;
			memcpy(l,ll,sizeof(l));
			transTime[i] = transTime[i-1] + t[i-1];//终点是第i个湖时在路上要花费的时间(/5min)
			fishingTime = h - transTime[i];
			while(fishingTime > 0){
				temp =-1;
				for(int j = 1; j <= i; ++j){
					if(l[j].f > temp){
						temp = l[j].f;
						mark = j;
					}
				}   //每次钓鱼前找到这个Interval里可以钓到的最多的鱼
				numOfFish += temp;
				fishingTime -= 1;
				++tt[mark];
				if(l[mark].f > l[mark].d){
					l[mark].f -= l[mark].d;
				}
				else{
					l[mark].f = 0;
				}
			}   //end while
			if(numOfFish> rec){
				rec = numOfFish;
				memcpy(bestt,tt,sizeof(tt));
			}
			else if(numOfFish == rec){
				int k = 1;
				while(k < n && tt[k] == bestt[k]){++k;		}
				if(tt[k] > bestt[k]){
					for(int q = k ; q <= n; ++q){
						bestt[q]=tt[q];
					}
				}
			}
		}
	    if(former){
				printf("\n");
			}
		for(int i = 1; i <= n; ++i){
			if(i != 1){
				printf(", ");
			}
			printf("%d",bestt[i] * 5);
		}   // end for
		printf("\n");
		printf("Number of fish expected: %d\n",rec);
		former = true;
	}
	return 0;
}




经典贪心+枚举:

1.枚举可以钓鱼的最后一个湖,把路上的时间减去;

2.John可以在不同的湖之间"瞬间转移",然后每一个interval选择可以钓上来最多鱼的湖;

3.注意每一次得到一个与之前相同的numOfFish,要得到字典序最大的各湖停留时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值