题目传送

(其实有一个更正经的题解)

看了许久,发现这题貌似就是一个动态规划啊,但毕竟是贪心题库里的题,还是想想用贪心解吧。

经过(借鉴大佬思路)十分复杂的思考后,终于理解出了这题的贪心思路。该题的难点主要在最后可在任意湖边停住,而且不能往回走,在一个湖钓鱼时的效率还会越来越少。常规的思路看来是不行的了,题目好多动态未知的量,唯有我们更换角度,“化动为静”:

即然最后不知道停在哪个湖,那就分类讨论呗。把停在每个湖的最优解全部求出,在最后取个最优解不就行了吗?发现当我们知道主人公最后停在哪个湖后,她的路径也就唯一确定了(例如佳佳最后停在了第i个湖,那么她的路径一定是1—》2—》3—》。。。—》i),同时她的纯钓鱼时间可由总空闲时间减去行程时间唯一确定。考虑从哪个湖钓鱼一个5分钟,就相当于在路径1—》2—》3—》。。。—》i中的一个节点上“堆”上一个标记表示在这个湖又钓了5分钟的鱼,显然这里可用贪心策略,每次标记目前为止五分钟钓鱼数目最大的那个湖,并使当前记录答案的sumi+=在那个湖又钓的鱼数。最后比较所有的sumi(i=1,2,...,n)取最大的输出就行了。

还不懂?也许看看AC代码就懂了:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<vector>
 5 using namespace std;
 6
 7 int ans;
 8
 9 vector<int>fish,lesss,t;//每个湖第一个 5 分钟能钓到鱼的数量,每个湖每钓鱼5分钟较前5分钟钓的鱼数减少的数量,如题意
10 vector<int>get,tmpfish;//从第一个湖走到第i个湖所需时间,每个湖的当前5分钟能钓到的鱼数
11
12 char ch;
13
14 inline int read()//快读(亦名读入优化)
15 {
16     ans=0;
17     ch=getchar();
18     while(!isdigit(ch)) ch=getchar();
19     while(isdigit(ch)) ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
20     return ans;
21 }
22
23 inline void init()//初始处理动态数组,因为希望动态数组的下标从1开始
24 {
25     fish.push_back(0);
26     lesss.push_back(0);
27     t.push_back(0);
28     get.push_back(0);
29     get.push_back(0);//注意get数组在主函数是从下标为2的开始处理的,因此需要多填一个0。
30     tmpfish.push_back(0);
31 }//为什么要填0?为了与普通全局数组的性质相同(定义时默认全初始化为0)
32
33 int main()
34 {
35     init();
36     int n=read(),h=read()*12;
37     for(int i=1;i<=n;i++) fish.push_back(read());
38     for(int i=1;i<=n;i++) lesss.push_back(read());
39     for(int i=1;i<n;i++) t.push_back(read());
40     for(int i=2;i<=n;i++) get.push_back(get[i-1]+t[i-1]);
41     int mava,mapo,tmphours,matot=0;//当前贪心找到的最大值,当前贪心找到的最大值对应的下标(即湖的编号),当前纯钓鱼时间,最后的答案。
42     for(int i=1;i<=n;i++) tmpfish.push_back(0);
43     for(int k=1;k<=n;k++)
44         if(h>get[k])
45         {
46             tmphours=h-get[k];//可用的纯钓鱼时间
47             for(int i=1;i<=k;i++) tmpfish[i]=fish[i];//初始化
48             int sum=0;//记录的当佳佳最后停在第k个湖时的当前答案
49             while(tmphours>0)
50             {
51                 mava=-2000000000;
52                 mapo=0;
53                 for(int i=1;i<=k;i++)//贪心选择
54                     if(mava<tmpfish[i])
55                     {
56                         mava=tmpfish[i];
57                         mapo=i;
58                     }
59                 if(mava<=0) break;//没鱼可钓就直接退出
60                 sum+=mava;
61                 if(tmpfish[mapo]>lesss[mapo]) tmpfish[mapo]-=lesss[mapo];
62                 else tmpfish[mapo]=0;
63                 tmphours--;
64             }
65             if(sum>matot) matot=sum;
66         }
67         else break;
68     printf("%d",matot);
69     return 0;
70 }


最后再总结一下贪心吧:

贪心策略的确定:看到题时,可根据生活经验(滑稽)确认一个直觉指引的贪心策略。对付简单题很有用。

        关注一下与题目有关的性质(可以是由数学推导的式子,或是题中描述的物品的一些跟生活有关的物理性质)基本跟贪心有关的题都会有找某个方面的最大值或最小值。

贪心策略的证明: 直接数学推导。

        假设有一个更优的方案,反证。

        玄学占卜

贪心的几点注意:当整体最优解可由局部最优解推出(并不只局限与一种策略)时才可用贪心。(否则用动态规划)

        基本能用贪心的动态规划都行,不过一般贪心的复杂度要优于动态规划。

转载于:https://www.cnblogs.com/InductiveSorting-QYF/p/10987715.html

贪心整理一本通1431:钓鱼题解相关推荐

  1. 信息学奥赛一本通超详细题解,动画图文题解

    内容来源于微信公众号:大神编程.已经过原文作者授权. 更新时间:2020-11-5 现在开始更新基础算法题. 个人感言:从未见过如此详细的题解,动画.图文结合,适合任何水平的选手.尤其是特别适合自学的 ...

  2. C++奥赛一本通递推题解

    title: C++奥赛一本通刷题记录(递推) date: 2017-11-08 tags: 一本通 openjudege categories: OI C++奥赛一本通刷题记录(递推) 2017.1 ...

  3. P1717 钓鱼 题解

    P1717 钓鱼 多重背包-完全背包 其实因为在每一个地方都可以钓无限久的鱼,所以是完全背包 而又因为钓久了,鱼的数量就变成了负数了,所以又得当成多重背包做QAQ 跟多重背包不同的,这题每个池塘只能选 ...

  4. 信息学奥赛一本通高手训练题解目录

    第1部分 基础算法(高手训练)-->第1章 贪心算法 1.1.1 扑克牌 1.1.2 游戏通关 1.1.3 楼间跳跃 1.1.4 堆蛋糕 1.1.5 塔 第1部分 基础算法(高手训练)--> ...

  5. 一本通例题-生日蛋糕——题解超强深搜剪枝,从无限到有限

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  6. Leecode题解汇总(附题型归类)

    虽然已找到工作,但不断地自我学习和自我磨砺是无止境的. 为方便量化和总结经验,记录一下个人的Leecode刷题记录,之前的刷题并没有收录进去,有时间会统一整理. 序号 题目 题解 类型 来源 难度 0 ...

  7. 提高篇 第一部分 基础算法 第1章 贪心算法

    一本通提高篇在线提交地址 一本通提高篇在线提交地址_老象的专栏-CSDN博客 [ 贪心 进阶总结 ][ 来自一本通提高篇 ] [ 贪心 进阶总结 ][ 来自一本通提高篇 ]_violinwang-CS ...

  8. CodeForces - 1457E New Game Plus!(贪心)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,需要自己定义一种顺序去遍历序列,每次需要维护答案: ans += sum sum += a[ i ] 有 k 次机会可以将 sum 清零,问如 ...

  9. 【UOJ#386】【UNR#3】鸽子固定器(贪心)

    [UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那 ...

  10. AcWing蓝桥杯AB组辅导课07、贪心

    文章目录 前言 一.贪心 模板题 例题1:AcWing 104. 货仓选址(贪心,简单,算法竞赛进阶指南) 分析 题解:贪心思路 例题 例题1:AcWing 1055. 股票买卖 II(贪心.状态机, ...

最新文章

  1. C#做的在线升级小程序
  2. cmd chcp命令切换字符格式UTF8
  3. linux常见问题及其解决方案集锦
  4. r语言模型评估:_情感分析评估:对自然语言处理的过去和未来的反思
  5. 爬取前尘无忧python职位信息并保存到mongo数据库
  6. 【并查集】黑魔法师之门(codevs 1995/joyoi-codevs 1995)
  7. javascript this的意思
  8. Solr4:加入中文分词IKAnalyzer2012 FF
  9. Waymo捷豹合推电动无人车I-PACE,将加入无人出租车队
  10. IEEE 物联网相关的标准
  11. 数据分析:Hive、Pig和Impala
  12. 如何学好Python自动化,每个进阶的测试人都应该看看
  13. JavaWeb学习思维导图
  14. VIVO市场ASO实战详解,vivo应用市场优化
  15. 判断多边形边界曲线顺/逆时针 两种方法
  16. EasyExcel自定义表头
  17. 【Java基础】JDK9 模块化
  18. android下存储设备的使用
  19. [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组
  20. cucumber介绍及简单使用

热门文章

  1. profile和bashrc
  2. [bzoj 3110][zjoi 2013]K大数查询
  3. Latex排版:CTeX winEdit 输出“系统找不到指定的文件”的解决办法)
  4. POJ1338 Ugly Numbers
  5. 微信无法连接到服务器怎么诊断网络【微信高级教程3】
  6. Windows 8实用窍门系列:16.Windows 8的右键菜单
  7. sqlserver 列出表字段和字段说明
  8. bootstrap3-iframe-modal子页面在父页面显示模态框
  9. jQuery..1..基本使用..选择
  10. careercup-链表 2.7