poj1042题解

h [1,16] hours
all_v=h*12 intervals
n [2,25] lakes
fi inital intervals
fi-di*v v [0,all_v)
题意,做每件事情的最小时间间隔是5分钟,走路是5分钟的整数倍,钓鱼时间必须是5分钟的整数倍。我们不妨把5分钟定义为一个时间单位,不如就临时定义“1慧”为5分钟吧。
有一条道,它旁边有n个湖,依次编号1-n,从湖i到i+1需要花费ti(慧)
john从湖1开始,只能朝编号大的湖走。可以停下选择钓鱼或者继续钓鱼。
一旦在湖i停下钓鱼,可以选择钓k(慧),k时整数。选择湖i的第一慧能钓的鱼是fi,然后每过1慧,钓的鱼少di
问题是怎样钓鱼钓鱼数最多?如果有多种方案,则选择第一个湖钓鱼数最长的;还有多组就第二个湖,第三个湖……
输入第一行是T,代表T组数据
每组数据
第一行是n,代表有n个湖
第二行是h,代表总共john总共有h个小时,也就是h*12(慧)
接下来n行,每行有两个数 fi,di
接下来是(n-1)数,代表ti


输出
输出在每个湖钓鱼的分钟数(注意不是“慧”,我们要换回题目说的了),都好分割
然后输出能钓多少鱼?


预先计算出在湖i钓h慧得鱼数 lake[i][h]


枚举加贪心
枚举在湖i终止所有的钓鱼活动,则走路的时间就已经明确不变了,不妨先剔除。假设剔除后有hui 慧时间
我们可以1慧1慧来钓鱼,选取所有当前所有湖中可获得鱼最多的湖。之后更新这个湖可以钓的鱼的数量。

注意:虽然看起来这样做是在各个湖之中切换来切换去,但是实际上不管我们1慧1慧选择的湖的顺序是怎么样的,我们都可以对应成在第i个湖钓鱼pi慧时间,是并没有违反题目的钓鱼规则。


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int max_hui=400;
const int maxn=25;
int n,hui;
int t[maxn+2],f[maxn+2],d[maxn+2],ans_list[maxn+2],st[maxn+2],ans;
int tf[maxn+2],tans_list[maxn+2],tans;

void work(int hui,int n)
{
	int x;
	ans=0;
	memset(ans_list,0,sizeof(ans_list));
	for (int h=1;h<=hui;++h) {
		x=0;
		for (int i=1;i<n;++i)
			if (f[x]<f[i])
				x=i;
		ans_list[x]++;
		ans+=f[x];
		if (f[x]>d[x])
			f[x]-=d[x];
		else
			f[x]=0;
	}
}

bool is_better(int n)
{
	int i;
	if (ans>tans) return true;
	if (ans<tans) return false;
	for (i=0;i<n-1;++i)
		if (ans_list[i]!=tans_list[i])
			break;
	return ans_list[i]>tans_list[i];
}

int main()
{
	void init();
	void backup();
	bool first=true;
	while (1) {
		if (first)
			first=false;
		else
			printf("\n");
		init();
		if (!n) break;
		tans=-1;
		memcpy(tf,f,sizeof(f));//backup
		for (int end=0;end<n;++end) {
			work(hui-st[end],end+1);
			if (is_better(end+1)) {
				tans=ans;
				memcpy(tans_list,ans_list,sizeof(ans_list));
			}
			memcpy(f,tf,sizeof(f));//restore
		}
		for (int i=0;i<n-1;++i)
			printf("%d, ",tans_list[i]*5);
		printf("%d \n",tans_list[n-1]*5);
		printf("Number of fish expected: %d \n",tans);
	}
	return 0;
}

void init()
{
	scanf("%d",&n);
	if (n==0) return;
	scanf("%d",&hui);hui*=12;
	for (int i=0;i<n;++i)
		scanf("%d",f+i);
	for (int i=0;i<n;++i)
		scanf("%d",d+i);
	st[0]=0;
	for (int i=0;i<n-1;++i) {
		scanf("%d",t+i);
		st[i+1]=st[i]+t[i];
	}
}


全部评论

相关推荐

头像 会员标识
昨天 17:08
已编辑
牛客_产品运营部_私域运营
腾讯 普通offer 24k~26k * 15,年包在36w~39w左右。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务