//11074526c00h00g1042Accepted572K125MSG++3624B2012-12-03 19:05:06//思想:枚舉,使用優先隊列實現的,見黑書 //tm數組竟然不能開//runtime error,開始理解錯了,以為是將時間加到第一個捕到魚的湖上面,其實是加在第一個湖上面就行了 #include<stdio.h>#include<stdlib.h>#include<queue>#include<string.h>using namespace std;int n,h;struct Node{ int id;//用來標識lake的id int fi;//剩餘魚的數量 int di;//每五分鐘減少的數量 int time;//在該湖中釣魚的次數 bool operator<(const Node &nd) const{ //若fi相同的話,需要按照id小的順序選擇 if(fi!=nd.fi) return fi<nd.fi; else return id>nd.id; } Node(){ time=0; }};Node lake[30];int ans[30];int tmm[30];//t1表示從湖1到湖2的行駛時間需要乘以5 priority_queue<Node> q;void clear(){ while(!q.empty()) q.pop();}//表示每一個湖使用的時間,初始化為0 int main(){ while(scanf("%d",&n)!=EOF&&n){ scanf("%d",&h); h=h*60; for(int i=1;i<=n;i++){ scanf("%d",&lake[i].fi); lake[i].id=i; } for(int i=1;i<=n;i++) scanf("%d",&lake[i].di); //tmm表示從湖i到湖i+1所需要的時間 for(int i=1;i<n;i++) scanf("%d",&tmm[i]); //因為一開始在湖1的位置所以tmm[0]表示從湖0到湖1的時間 //枚舉每一個湖 tmm[0]=0; int tmm_left,max=-1; for(int i=1;i<=n;i++){ tmm_left=0; for(int j=0;j<i;j++) tmm_left+=tmm[j]*5; //剩餘可使用時間 tmm_left=h-tmm_left; //湖更多的話,時間更不夠了,所以跳出 if(tmm_left<=0) break; else{ clear(); for(int j=1;j<=i;j++) q.push(lake[j]); //剩餘釣魚次數 int t=tmm_left/5,sum=0; Node tmmp; while(t>0){ tmmp=q.top(); //時間沒用完,魚釣完了 if(tmmp.fi<=0) break; q.pop(); t--; sum+=tmmp.fi; tmmp.fi-=tmmp.di; tmmp.time++; q.push(tmmp); } //時間沒有用完,魚就釣完了 if(t>0){ //ll表示剩下的時間,需要添加到第一個訪問的湖的身上 int ll=t*5; if(max<sum){ max=sum; memset(ans,0,sizeof(ans)); Node tmmp; while(!q.empty()){ tmmp=q.top(); q.pop(); //該湖使用過 if(tmmp.time>0){ ans[tmmp.id]=tmmp.time*5; } } ans[1]+=ll; } } //時間用完了 else{ if(max<sum){ max=sum; memset(ans,0,sizeof(ans)); Node tmmp; while(!q.empty()){ tmmp=q.top(); q.pop(); //該湖使用過 if(tmmp.time>0){ ans[tmmp.id]=tmmp.time*5; } } } } }//end else }//end for for(int i=1;i<=n;i++){ if(i!=n) printf("%d, ",ans[i]); else printf("%d",ans[i]); } printf("\n"); printf("Number of fish expected: %d\n",max); printf("\n"); } return 0;}