传送门

•参考资料

 2019CCPC网络选拔赛 H.Fishing Master(思维+贪心)

•题意

  池塘里有 n 条鱼,捕捉一条鱼需要花费固定的 k 时间;

  你有一个锅,每次只能煮一条鱼,其中煮熟第 i 条鱼至少需要 ti 时间;

  你在煮鱼的时候可以选择去钓一条鱼,也可也选择不钓;

  但是,一旦你决定钓鱼,就必须花费 k 时间调到一条鱼;

  任何时刻,你都可以有多条鱼待煮;

  问将所有的鱼钓上来并煮熟所有的鱼最少需要多少时间;

•题解

  理想的方案是只有在钓第一条鱼的时候锅是空的,其余任意时刻,锅都在做有用功;

  锅在做有用功指的是第 i 条鱼在锅中煮的前 ti 时间,多煮的时间称锅在做无用功;

  这种情况下,只需要且必须花费 $k+\sum_{i=1}^{n}t_i$ 时间就可以将所有鱼全部钓上来并全部煮好;

  那么,实际情况并非如此,要想花费最少的时间,首先得明确在什么情况下可能会导致时间浪费;

  假设你当前煮的鱼需要花费 t 时间,钓鱼需要花费 k 时间;

  你可以在这 t 时间内钓 $\frac{t}{k}$ 条鱼上来,在钓鱼的时间,锅处于煮鱼状态;

  但是剩下的 t%k 时间不足以再钓一条上来;

  此时,你就有两个决策可以选择:

    决策1:去钓下一条鱼;

    决策2:等待 t%k 时间往锅中放入下一条鱼;

  当然,选择 决策2 的前题是你得有鱼可煮;

  如果你手中有鱼的话,肯定要选择 决策2,因为等待的这 t%k 时间是必须的;

  而如果选择 决策1,那么煮当前这条鱼会花费 t+k-t%k 时间,前 t 时间锅在做有用功,是必须的;

  但是后 k-t%k 时间,锅就在做无用功,是在浪费时间;

  如果你当前手中无鱼,那么你不得不去钓鱼,那么就一定要浪费当前的 k-t%k 时间么?

  假设你现在已经煮了 i 条鱼(包括当前煮的这条鱼);

  那么,你完全可以在前 i 条鱼中找个 tj%k($j \in [1,i]$)大的从而使得浪费的 k-tj%k 时间尽可能的小;

  找 tj%k 大的就可以使用优先级队列了;

  那么,接下来就要分析一下优先钓哪条鱼了;

  当然是优先钓煮的时间较长的鱼了,因为在煮这条鱼的时候,你会尽可能多的钓上来其他的鱼,从尽可能多的选择决策2;

•代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=1e5+50;
 5 ll t[maxn];
 6 int n;
 7 ll k;
 8
 9 int main()
10 {
11     ios::sync_with_stdio(0);
12     int T;
13     cin>>T;
14     while(T--)
15     {
16         cin>>n>>k;
17         for(int i=1;i<=n;i++)
18             cin>>t[i];
19         sort(t+1,t+1+n,greater<int>());///为了保证尽可能多钓鱼
20         ll ans=k;///钓第一条鱼时间
21         ll cnt=1;///可煮的鱼数
22         priority_queue<int> pq;
23         for(int i=1;i<=n;i++)///煮鱼
24         {
25             ans+=t[i];
26             cnt+=t[i]/k;///煮鱼时所钓的鱼
27
28             ///已经没有可煮的鱼,需要钓鱼
29             ///由于t是从大到小排序,
30             ///当前煮鱼时已钓不到鱼,那以后也钓不到
31             ///需要额外长时间煮鱼以去钓鱼
32             if(cnt<i)
33             {
34                 ans+=k-pq.top();
35                 pq.pop();
36             }
37             pq.push(t[i]%k);///k-t[i]%k小 额外功少
38         }
39         cout<<ans<<"\n";
40     }
41 }

View Code

转载于:https://www.cnblogs.com/MMMinoz/p/11431748.html

HDU 6709“Fishing Master”(贪心+优先级队列)相关推荐

  1. Fishing Master(贪心算法)

    题目链接: Fishing Master 大致题意: 湖里有n条鱼, 每钓一条鱼需要花费的时间为m(可以选择钓第几条鱼). 只能同时烹饪一条鱼, 烹饪第i条鱼所花费的时间至少为a[i], 可以在烹饪的 ...

  2. 【POJ 3614 Sunscreen】贪心 优先级队列

    题目链接:http://poj.org/problem?id=3614 题意:C头牛去晒太阳,每头牛有自己所限定的spf安全范围[min, max]:有L瓶防晒液,每瓶有自己的spf值和容量(能供几头 ...

  3. 树形结构:优先级队列,堆

    优先级队列,堆是比较常用的数据结构,分支限界法,贪心法均会用到优先级队列 有必要了解一下优先级队列的实现方式 # -*- coding: utf-8 -*-# 最大堆# 很显然这是一个双针模型,指着一 ...

  4. 限界分支法:01背包问题,优先级队列(包含解的追踪)

    前面提到: 不知道大家注意到没有?上述实现方式没有使用单位体积价值的排序,和之前提到01背包回溯法基于单位体积价值实现不一样(先装单位体积价值高的). 我们网上经常看到都是基于以上实现的,到底这个用有 ...

  5. java集合——队列和双端队列+优先级队列

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合--队列和双端队列+优先级队列 的相关知识: 0.2) for full sou ...

  6. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  7. Rabbitmq超级详细的笔记,包括安装,基本命令,rabbitmq的七种消息模式,以及死信队列,延迟队列,优先级队列和惰性队列的介绍

    RabbitMQ 文章目录 RabbitMQ 1 RabbitMQ介绍 1.1 基本介绍 1.2 RabbitMQ的安装 1.2.1 ubuntu20.04 安装rabbitmq 1.2.2 cent ...

  8. 基于最小优先级队列构造哈夫曼树 Java

    哈夫曼编码是一种前缀编码,也就是说,它编码的字符,任何一个字符的编码都不是另一个字符的前缀,这使得对哈夫曼编码进行解码变得容易.而使得哈夫曼编码是前缀编码的关键就是哈夫曼树.哈夫曼树也正是本文要说的. ...

  9. 优先级队列实现哈夫曼树的编码和译码

    //优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using nam ...

最新文章

  1. 如何在手机上打开xmind文件_如何将手机上的文件导入电脑
  2. 大数据面临的挑战:当大数据遭遇云计算
  3. 2018年下半年网络公式考试案例分析真题
  4. pandas isnull函数检查数据是否有缺失
  5. 从0开始学习 GitHub 系列之「05.Git 进阶」
  6. java秒数格式转换_Java中整数(秒数)转换为时分秒格式(xx:xx:xx)
  7. Websocket兼容IE8问题
  8. 对粒子滤波算法的理解 特别通俗易懂
  9. 从平面坐标转球面坐标加旋转
  10. [笔记] Golang小试实现神经网络框架
  11. 小程序在政务服务平台建设中如何发挥价值
  12. PMP/高项 项目范围管理实践
  13. spss度量 名义 有序
  14. 用C++实现简单的小游戏
  15. python+openCV 自适应阈值分割
  16. TD-SCDMA介绍
  17. Alibaba园区中的雕塑:a big man
  18. windows 10对应驱动下载和应用
  19. 计量广义差分操作过程_计量经济学总结
  20. VSTO Office二次开发应用程序键盘鼠标钩子

热门文章

  1. 树莓派 mysql集群_多树莓派集群服务器
  2. idea创建文件自定义注释
  3. apereo cas mysql_Apereo CAS 5.0.X 默认提供的数据库认证的四种方式
  4. mysql 轨迹数据存储_python爬虫26 | 把数据爬取下来之后就存储到你的MySQL数据库...
  5. java链表实现_数据结构——基于java的链表实现(真正理解链表这种数据结构)...
  6. java forEach使用
  7. vue实现查询多条记录_sql:多表查询
  8. c语言一维数组课件,第9章:c语言一维数组课件
  9. python内置数据结构_Python基础知识2-内置数据结构(下)
  10. linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍df...