poj 1042

//枚举+贪心+优先队列
//最有的方案肯定是从起点走到某个点终止,然后在这条路上通过贪心选择最优的选择(每个点应停留的时间)。最后通过比较得出最优的方案
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=26;
int t_spent[maxn],eve[maxn][maxn],cost[maxn],d[maxn];
int n,h;
struct node
{
	int num,begin;
};
node f[maxn];
bool operator<(node a,node b)
{
	if(a.begin==b.begin) return a.num>b.num;
	else return a.begin<b.begin;
}
int solve(int loc,int left)
{
	priority_queue<node> q;
	int i,amount=0;
	for(i=1;i<=loc;i++) q.push(f[i]);
	while(left>=5)
	{
	    if(q.empty()) break;
		node tem=q.top();
        q.pop();
		amount+=tem.begin;
		tem.begin-=d[tem.num];
		if(tem.begin<0) tem.begin=0;
		eve[loc][tem.num]+=5;
		q.push(tem);
		left-=5;
	}
	return amount;
}
int main()
{
	while(cin>>n)
	{
		if(n==0) break;
		scanf("%d",&h);
		memset(eve,0,sizeof(eve));
		memset(cost,0,sizeof(cost));
        int max=-1;
		int i;
		for(i=1;i<=n;i++)
		{
			f[i].num=i;
			cin>>f[i].begin ;
		}
		for(i=1;i<=n;i++) cin>>d[i];
		int tem;
		for(i=2;i<=n;i++)
		{
			scanf("%d",&tem);
			cost[i]=cost[i-1]+tem*5;
		}
		int ou,maxloc;
		for(i=1;i<=n;i++)
		{
			ou=solve(i,h*60-cost[i]);
			if(ou>max)
			{
			  max=ou;
			  maxloc=i;
			}
        }
		for(i=1;i<=n;i++)
		{
		    if(i!=1) printf(", ");
		    printf("%d",eve[maxloc][i]);
		}
		printf("\n");
		printf("Number of fish expected: %d\n\n",max);
	}
	return 0;
}


转载于:https://www.cnblogs.com/lj030/archive/2012/12/21/3002282.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值