二分與貪心-Gone Fishing(演算法基礎 第9周)

NodYoung發表於2016-06-23

問題描述:
這裡寫圖片描述
分析
共n個湖,h個小時的時間;每個湖首次可釣到fi條魚,往後一次遞減di條,從i湖走到i+1湖需ti×5分鐘。問:指定時間內最多可釣多少條魚。
參考程式碼;http://blog.csdn.net/lyhvoyage/article/details/23289531 。按他的方式,第一種方法測試超時,第二種使用優先佇列方法可以通過。但自己寫了兩個,即使使用優先佇列也會超時,呃,,鬱悶,,程式碼先放這兒,以後再調。
原始碼
//程式碼1,不使用優先佇列,超時

#include <iostream>  
#include <vector>
#include <cstring>
using namespace std;  

int n, h;
vector<int> fi(25), di(25), ti(25);
int ft[25];
//在0~k之間釣魚
int index_maxfi(const int& k,const vector<int>& kfi) {
    int ind=0;
    int maxfi=kfi[0];
    for(int i=1; i<=k; i++) {
        if (maxfi<kfi[i]){
            maxfi=kfi[i];
            ind=i;
        }
    }
    return ind;
}


//在0~k之間釣魚
int fish(const int& k, vector<int> kfi) {
    int nfishes=0;
    int rest_h=h;
    int ind;
    while(rest_h) {
        ind = index_maxfi(k, kfi);
        if (kfi[ind]==0) {
            ft[0] += rest_h;
            break;
        }
        nfishes += kfi[ind];
        ft[ind]++;
        if (kfi[ind]>di[ind])
            kfi[ind] -= di[ind];
        else
            kfi[ind] = 0;
        rest_h--;
    }
    return nfishes;
}

int main() {
    while(cin>>n && n>0) {
        cin >> h;
        h *= 12;
        for(int i=0; i<n; i++) {
            cin >> fi[i];
        } 
        for(int i=0; i<n; i++) {
            cin >> di[i];
        } 
        for(int i=0; i<n-1; i++) {
            cin >> ti[i];
        } 

        int maxfishes=0;
        vector<int> fishtime(n, 0);
        for (int i=0; i<n; i++)
        {
            if (i>0){
                h -= ti[i-1];
            }
            memset(ft, 0, sizeof(ft));

            int tempf=fish(i, fi);
            if (maxfishes < tempf) {
                maxfishes = tempf;
                for (int j=0; j<=i; j++){
                    fishtime[j] = ft[j]*5;
                }
            }           
        }
        cout << fishtime[0];
        for(int i=1; i<n; i++) cout << ", " << fishtime[i];
        cout << endl;
        cout << "Number of fish expected: " << maxfishes << endl;
        cout << endl;
    }
}

//程式碼2,使用優先佇列,還是超時,日後再看

#include <iostream>  
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <stdio.h>
using namespace std;  

int n, h;
int ft[25];
struct Fish 
{
    int i; //ith個魚塘
    int f;
    int d;
    int t;
    Fish():i(99),f(0),d(0),t(0) {}
};
bool operator < (const Fish& a, const Fish& b){
    if (a.f==b.f){
        return a.i>b.i;  //如果多個計劃存在時,選擇靠前的
    }
    else {
        return a.f<b.f;
    }
}
vector<Fish> gofish(25); 
//在0~k之間釣魚
int fish(int& k) {
    int nfishes=0;
    int rest_h=h;
    priority_queue<Fish, vector<Fish>, less<Fish> > q;
    for(int i=0; i<=k; i++) {
        q.push(gofish[i]);
    }
    Fish topfish;
    while(rest_h) {
        topfish=q.top();
        if (topfish.f==0){
            ft[0] += rest_h;
            break;
        }
        nfishes += topfish.f;
        ft[topfish.i]++;
        if (topfish.f>topfish.d)
            topfish.f -= topfish.d;
        else
            topfish.f = 0;
        q.pop();
        q.push(topfish);
        rest_h--;
    }
    return nfishes;
}

int main(){  
    while(~scanf("%d",&n) && n>0) {
        scanf("%d",&h);
        h *= 12;
        for(int i=0; i<n; i++) {
            scanf("%d",&gofish[i].f);
            gofish[i].i=i;  //為每個魚塘編上號
        } 
        for(int i=0; i<n; i++) {
            scanf("%d",&gofish[i].d);
        } 
        for(int i=0; i<n-1; i++) {
            scanf("%d",&gofish[i].t);
        } 
        int maxfishes=0;        
        vector<int> fishtime(n, 0);
        for (int i=0; i<n; i++)
        {
            if (i>0){
                h -= gofish[i-1].t;
            }
            memset(ft, 0, sizeof(ft));;
            int tempf=fish(i);
            if (maxfishes < tempf) {
                maxfishes = tempf;
                for (int j=0; j<=i; j++){
                    fishtime[j] = ft[j]*5;
                }
            }           
        }
        cout << fishtime[0];
        for(int i=1; i<n; i++) cout << ", " << fishtime[i];
        cout << endl;
        cout << "Number of fish expected: " << maxfishes << endl;
        cout << endl;
    }
    return 0;  
}  

相關文章