poj 1042 釣魚問題 郭煒老師慕課例題(貪心+枚舉)

題目鏈接:http://poj.org/problem?id=1042

這題是慕課郭煒老師算法課程裏面的一道例題,我用他教的思路寫出來的代碼。 

 

代碼長了點 但是內容簡單  思路易懂!

 

附郭煒老師課件截圖和視頻講解地址

 

1、題意:

 

2、分析 

 

 

 

本題思路就是枚舉最終停下來的湖,這樣就能算出純釣魚的時間片個數 K 。然後用一個三元組(F,i,j)表示第 i 個湖的第 j 個時間片所能釣到魚的數量爲F。然後按照釣魚的數量從大到小排序(注意排序這塊是個難點,要用到stable_sort 我就是在這錯了)。取前K個即是問題的答案!

 

代碼


#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<stdlib.h>
#include<sstream>
#include<set>
#include<cmath>
typedef long long ll;
using namespace std;

struct node1
{
    int fishnum;
    int time[30];
};
struct node2///(F,no,tt)三元組表示第no個湖的第tt個時間片所能釣到魚的數量爲F。
{
    int F;
    int no;
    int tt;
};
struct rule1
{
    bool operator()( const node1 &t1,const node1 &t2)
    {
        return t1.fishnum>t2.fishnum;
    }
};
struct rule2
{
    bool operator()(const node2 &t1,const node2 &t2)
    {
        return t1.F>t2.F;
    }
};
int maxfish;

int main()
{
//    freopen("in.txt","r",stdin);
    ios::sync_with_stdio(false);
    int n;
    while(cin>>n&&n)
    {
        node1 a[30];
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                a[i].time[j]=0;
        }
        int h;
        maxfish=0;
        int f[30];
        int d[30];
        int t[30];
        cin>>h;
        for(int i=1;i<=n;i++) cin>>f[i];
        for(int i=1;i<=n;i++) cin>>d[i];
        t[0]=0;//到第一個湖的時間爲0
        for(int i=1;i<n;i++) cin>>t[i];
        int k=0;///純釣魚的時間片個數
        for(int x=1;x<=n;x++)///枚舉最終停下來的湖
        {
            int walktime=0;//走路用的時間片
            for(int j=1;j<x;j++)
                walktime+=t[j];
            k=h*12-walktime;//純釣魚的時間片個數
            node2 m[5000];///最多就是n*k個
            int kase=0;
            int number=0;
            for(int i=1;i<=x;i++)
                for(int j=1;j<=k;j++)
                {
                    number=f[i]-(j-1)*d[i];
                    if(number>0)
                    {
                        m[kase].F=number;
                        m[kase].no=i;
                        m[kase].tt=j;
                        kase++;
                    }
                    else
                    {
                        m[kase].F=0;
                        m[kase].no=i;
                        m[kase].tt=j;
                        kase++;
                    }
                }
            stable_sort(m,m+kase,rule2());///!!!!!!!!!用
//            for(int i=0;i<kase;i++)
//            {
//                cout<<m[i].F<<" "<<m[i].no<<" "<<m[i].tt<<endl;
//            }
            int num=0;
            for(int i=0;i<k;i++)
                num+=m[i].F;
            a[x].fishnum=num;
            for(int i=0;i<k;i++)
            {
                for(int j=1;j<=x;j++)
                {
                    if(m[i].no==j)
                    {
                        if(m[i].tt>a[x].time[j])
                            a[x].time[j]=m[i].tt;
                    }
                }
            }
//            cout<<"-----------------------"<<endl;
        }
        sort(a+1,a+1+n,rule1());
        for(int i=1;i<=n;i++)
        {
            if(i==n)
                cout<<a[1].time[i]*5<<endl;
            else
                cout<<a[1].time[i]*5<<", ";
        }
        cout<<"Number of fish expected: "<<a[1].fishnum<<endl<<endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章