POJ 1042 GoneFishing

本文详细介绍了如何使用C++解决ACM问题,通过优化算法找到最佳钓鱼策略,使得人在瞬移到达鱼最多湖的过程中,获得最大的鱼类数量。文中包括了输入输出解析、数据结构设计和循环迭代求解过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题以前用Java做ACM的时候做过了..因为是按照分类做的,所以就用C++又写了一遍..

哎,还是新手啊,写过的题目还是写了蛮久...

假设人是可以瞬移的,每次都到鱼最多的湖里去钓鱼..

注意要对人最后停在哪一个湖分别考虑(人从起点到该湖的路程只用走一次).

#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
struct lake{
	int fi,di;
}la[30],te[30];
int ti[30];
int times[30];//临时储存时间 
int besttime[30];//最佳方案的时间 
int main(){
	int lakes,t;//总湖数,总时间 
	while(scanf("%d",&lakes)&&lakes!=0){
		memset(besttime,0,sizeof besttime);
		scanf("%d",&t);
		for(int i=0;i<lakes;i++){
			scanf("%d",&la[i].fi);
		} 
		for(int i=0;i<lakes;i++){
			scanf("%d",&la[i].di);
		}
		ti[0]=0;
		for(int i=1;i<lakes;i++){
			scanf("%d",&ti[i]);
			ti[i]=ti[i]+ti[i-1];
		}
		int fishs,maxfish=0;
		t=t*60; 
		//对只到第i个湖的情况分别计算 
		for(int i=0;i<lakes;i++){
			int rtime=t;
			fishs=0; 
			rtime-=ti[i]*5;//先把走路的时间去掉 
			memset(times,0,sizeof(times));//时间清0 
			for(int j=0;j<lakes;j++){//初始化临时储存数组 
				te[j].fi=la[j].fi;
				te[j].di=la[j].di; 
			}
			while(rtime>0){	
				int maxindex=0;
				for(int k=1;k<=i;k++){//找出鱼最多的池子 
					if(te[k].fi>te[maxindex].fi)maxindex=k;
				}
				if(te[maxindex].fi<=0){//没有湖有鱼了 
					times[0]+=rtime;
					rtime=0;
				}else{//处理这个湖中的鱼~ 
					times[maxindex]+=5;
					fishs+=te[maxindex].fi;
					te[maxindex].fi-=te[maxindex].di;
					rtime-=5;
				}
			}
			if(fishs>maxfish){//大于时直接赋值给结果 
				maxfish=fishs;
				for(int k=0;k<30;k++){
					besttime[k]=times[k];
				}
			}
			if(fishs==maxfish){//等于时比较第1个开始的湖所用的时间 
				for(int k=0;k<lakes;k++){
					if(times[k]<besttime[k])break;
					if(times[k]>besttime[k]){
						maxfish=fishs;
						for(int l=0;l<lakes;l++){
							besttime[l]=times[l];
						}
						break;						
					}
				}
			}
		}
		for(int i=0;i<lakes;i++){
			printf("%d",besttime[i]);
			if(i!=lakes-1)printf(", ");
		}	
		printf("\nNumber of fish expected: %d\n\n",maxfish);	
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值