Gone fish 1042

本文通过一个具体的钓鱼问题实例介绍了如何使用贪心算法解决问题。利用枚举的方式确定最佳的钓鱼策略,并采用动态规划进行优化。文章详细展示了算法的实现过程及代码细节。
//By XieJiang 2017/03/15-2017/03/16
//Gone Fishing 1042
//策略,采取贪心:每次选取鱼最多的池塘
//贪心+枚举,也是参考了别人的博客CIA明白的,DP也可以,无奈水平实在太渣
#include<iostream>
using namespace std;
int n, h;//记录池塘数量,允许小时数
int fish[26][26], ftime[26][26], f[26], d[26], t[25];//最终每个池塘的捕鱼数,池塘的花费的时间,池塘初始鱼数,下降比例,池塘之间的时间
int ans[26];//贪心下,总的鱼数量

int main() {
    int i, j, tn, th, emp, maxfish, maxschme, tf[26];
    cin >> n;
    while (n > 0) {
        cin >> h;
        h = h * 12;
        memset(ans, 0, sizeof(ans));
        memset(ftime, 0, sizeof(ftime)); memset(fish, 0, sizeof(ftime));
        for (i = 1; i <= n; i++)//输入每个池塘的鱼数量
            cin >> f[i];
        for (i = 1; i <= n; i++)//输入每个池塘每五分钟下降的鱼数量
            cin >> d[i];
        for (i = 1; i < n; i++)//输入相邻间隔池塘的路上花费的时间
            cin >> t[i];
        //开始枚举(从1到n)
        for (tn = 1; tn <= n; tn++) {
            //目前要垂钓的湖的范围是1-tn
            //计算路上花费的时间
            th = h;
            for (i = 1; i < tn; i++)
                th -= t[i];
            //将f[26]复制到一个临时的数组内,用以一次枚举过程
            for (i = 1; i <= tn; i++)
                tf[i] = f[i];
            //模拟垂钓过程,结束条件:湖空或者时间用光,同时剩余时间放入第一个湖。
            emp = 0;
            while (th > 0 && emp < tn) {
                //选择鱼最多的池塘
                maxfish = 1;
                for (i = 2; i <= tn; i++)
                    if (tf[i] > tf[maxfish])
                        maxfish = i;
                if (tf[maxfish] <= 0)
                    break;
                //表示下一次将选择这个池塘,将相关信息去除。
                ans[tn] += tf[maxfish];
                tf[maxfish] -= d[maxfish];
                ftime[tn][maxfish]++;
                th--;
                //判断空的湖
                if (tf[maxfish] <= 0)
                    emp++;
            }
            //将剩余未完时间归于湖1
            if (th > 0)
                ftime[tn][1] += th;

        }
        //选出鱼数量最多的方案
        maxschme = 1;
        for (i = 2; i <= n; i++) 
            if (ans[i] > ans[maxschme])
                maxschme = i;
        //输出结果
        for (i = 1; i < n; i++)
            cout << ftime[maxschme][i]*5 << ", ";
        cout << ftime[maxschme][n]*5 << endl;
        cout << "Number of fish expected: " << ans[maxschme] << endl;
        cin >> n;
        if (n != 0)
            cout << endl;
    }
}

 

转载于:https://www.cnblogs.com/1996313xjf/p/6558986.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值