1. 程式人生 > >釣魚(貪心+優先佇列+過載運算子)

釣魚(貪心+優先佇列+過載運算子)

釣魚

題目描述:
話說發源於小朋友精心設計的遊戲被電腦組的童鞋們藐殺之後非常不爽,為了表示安慰和鼓勵,VIP999決定請他吃一次“年年大豐收”,為了表示誠意,他還決定親自去釣魚,但是,因為還要準備2013NOIP,z老師只給了他H(1<=H<=16)個小時的空餘時間,假設有N(2<=n<=25)個魚塘都在一條水平路邊,從左邊到右編號為1、2、3、。。。、n)。VIP是個很講究效率的孩子,他希望用這些時間釣到儘量多的魚。他從湖1出發,向右走,有選擇的在一些湖邊停留一定的時間釣魚,最後在某一個湖邊結束釣魚。他測出從第I個湖到I+1個湖需要走5*ti分鐘的路,還測出在第I個湖邊停留,第一個5分鐘可以釣到魚fi,以後再每釣5分鐘魚,魚量減少di。為了簡化問題,他假定沒有其他人釣魚,也不會有其他因素影響他釣到期望數量的魚。請程式設計求出能釣最多魚的數量。
輸入輸出格式


輸入格式:
第一行:湖的數量n。
第二行:時間h(小時)。
第三行:n個數,f1,f2,…fn。
第四行:n個數,d1,d2,….dn。
第五行:n-1個數,t1,t2,….tn-1
輸出格式:
一個數,所能釣魚的最大數量。
輸入輸出樣例
輸入樣例1:
2
1
10 1
2 5
2
輸出樣例1:
31

#include<iostream>
#include<queue>
using namespace std;
const int maxn=30;
int n,h,ans,tot,t[maxn],d[maxn];
struct node
{
    int
f; int num; bool operator < (node x)const { return f<x.f; } }a[maxn]; priority_queue<node> q; int main() { cin>>n>>h; h=h*12; for(int i=1;i<=n;i++) { cin>>a[i].f; a[i].num=i; } for(int i=1;i<=n;i++) cin
>>d[i]; for(int i=1;i<=n-1;i++) cin>>t[i]; for(int i=1;i<=n;i++) { h=h-t[i-1];tot=0; while(!q.empty()) q.pop(); for(int j=1;j<=i;j++) q.push(a[j]); for(int j=h;j>0;j--) { node s; s.f=q.top().f-d[q.top().num]; s.num=q.top().num; if(q.top().f>0) tot+=q.top().f; q.pop(); q.push(s); } ans=max(ans,tot); } cout<<ans; return 0; }