poj 1042

来源:互联网 发布:java mac 绝对路径 编辑:程序博客网 时间:2024/06/06 07:23
//枚举+贪心+优先队列//最有的方案肯定是从起点走到某个点终止,然后在这条路上通过贪心选择最优的选择(每个点应停留的时间)。最后通过比较得出最优的方案#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;}