POJ 1042 枚舉+優先隊列

來源:互聯網
上載者:User
//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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.