贪心 - poj1042 Gone Fishing

来源:互联网 发布:微信改单是什么软件 编辑:程序博客网 时间:2024/05/22 15:50

题目:

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;}


0 0
原创粉丝点击