贪心 - poj1042 Gone Fishing

题目:

http://poj.org/problem?id=1042


题意:

某君去钓鱼,有h个小时的时间,n个渔场只能按编号顺序走,每次钓鱼需耗费5分钟,每个渔场每次钓到的鱼期望数量随次数增加递减,已知每个渔场初始期望fi,递减期望di,每个渔场间的距离所需时间ti,问最大期望鱼数,以及在每个渔场耗费的时间


思路:

枚举钓鱼过程中到达的渔场的最大编号N,最大编号确定后,在路上耗费的时间就确定了,在[1,N]间的渔场钓鱼等于瞬移,每次贪心取最大期望即可


代码:

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<functional>
#pragma comment(linker, "/STACK:102400000,102400000")//C++
using namespace std;

const double PI = 3.141592653589793238462643383279502884197169399;
const int MAXINT = 0x7fffffff;
const int MAXSIZE = 25 + 5;

struct node{
	int num, fish;
};
//最大堆
bool operator <(const node&p1, const node&p2){
	if (p1.fish==p2.fish) return p1.num>p2.num;
	return p1.fish<p2.fish;
}
priority_queue<node> q;


int main(){
    int n;
    int h;
    int f[MAXSIZE];
    int d[MAXSIZE];
    int t[MAXSIZE];
    int ans[MAXSIZE][MAXSIZE];
    while (cin>>n,n!=0){
        memset(ans,0,sizeof(ans));
        cin>>h;
        h*=12;
        for (int i=0;i<n;++i) cin>>f[i];
        for (int i=0;i<n;++i) cin>>d[i];
        for (int i=0;i<n-1;++i) cin>>t[i];
        //in

        int maxFish=0,maxAns=0;
        for (int i=0;i<n;++i){
            int ti=h;
            for (int k=1;k<=i;++k) ti-=t[k-1];
            if (ti<0) break;

            //cout<<i<<" "<<ti<<endl;
            while (!q.empty()) q.pop();
            for (int k=0;k<=i;++k){
                node temp={k,f[k]};
                q.push(temp);
            }
            int sum=0;
            while (ti){
                if (q.top().fish<=0) break;
                ti--;
                node temp=q.top();
                q.pop();
                ++ans[i][temp.num];
                sum+=temp.fish;
                temp.fish-=d[temp.num];
                q.push(temp);
            }
            if (ti) ans[i][0]+=ti;
            if (sum>maxFish){
                maxFish=sum;
                maxAns=i;
            }
        }

        for (int i=0;i<n;++i){
            cout<<ans[maxAns][i]*5;
            if (i!=n-1) cout<<", ";
        }
        cout<<endl;
        cout<<"Number of fish expected: "<<maxFish<<endl<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值