算法1 贪心

先考虑最远到哪个鱼塘,把路上的时间预先减掉,剩下的就是完全用于钓鱼的时间注意这里不用考虑折返的情况,因为如果折返前一个池塘钓鱼可以得到更优解,那么完全可以在之前就接着钓

因为一分钟计算一次鱼的数量,而每个鱼塘在第几分钟能钓到的鱼数量是可以确定的,且时间越靠前的数量越多,按样例打个表格

记完全用于钓鱼的时间为$t$,因为所用到的鱼塘的路程耗费时间已经是减过的,而一分钟钓一次鱼,所以只需在用到的池塘选择不多于$t$个的前几个数,它们的总和就是最终能钓到的鱼总数注意是每个池塘的前几个数,而且连续,因为有时间关系

实际上,计算的是总和,所选的数应尽可能大,而越靠前的数值越大,最优解也不会存在不连续的情况

无关顺序,取最大的前几个,因此考虑使用优先队列,或者放进ArrayList再进行排序

虽然用的是优先队列,但是时间复杂度并没有什么优化,还不如ArrayList+排序,有优化的优先队列需要存当前数值和衰减速度

代码

import java.util.*;

import java.lang.*;

public class Main {

static Scanner scanner = new Scanner(System.in);

static int n, T, N = 110; // 鱼塘个数 截止时间

static int[] a = new int[N], da = new int[N], ta = new int[N]; // 初始个数 衰减速度 移动时间

public static void main(String[] args) {

PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o2 - o1); // 大根堆

n = scanner.nextInt();

for (int i = 1; i <= n; i++) a[i] = scanner.nextInt();

for (int i = 1; i <= n; i++) da[i] = scanner.nextInt();

for (int i = 1; i < n; i++) ta[i] = scanner.nextInt();

T = scanner.nextInt();

int res = 0;

for (int k = 1; k <= n; k++) { // 枚举最远到达的鱼塘

int t = T, total = 0;

for (int i = 1; i < k; i++) t -= ta[i]; // 计算余下时间 这里可以用前缀和优化

for (int i = 1; i <= k; i++)

for (int j = a[i]; j > 0; j -= da[i]) pq.add(j); // 加入优先队列

while (t-- > 0 && !pq.isEmpty()) total += pq.poll(); // 获取不超过t个的前几个数

pq.clear(); // 一轮枚举 清空队列

res = Math.max(res, total); // 多种方案取最大值

}

System.out.println(res);

}

}

算法2 优先队列

思路同上,发挥优先队列的优势,在添加鱼塘可获得的鱼总数时,只放入所有能到达的鱼塘当前分别可获得的鱼条数

每次同样取最大的一个数,但现在省略了枚举,且队列的元素个数较少,访问速度快

代码

import java.util.*;

import java.lang.*;

public class Main {

static Scanner scanner = new Scanner(System.in);

static class Pair {

public int l, r;

public Pair(int l, int r) {

this.l = l;

this.r = r;

}

}

static int n, T, N = 110; // 鱼塘个数 截止时间

static int[] a = new int[N], da = new int[N], ta = new int[N]; // 初始个数 衰减速度 移动时间

public static void main(String[] args) {

PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o2.l - o1.l); // 大根堆

n = scanner.nextInt();

for (int i = 1; i <= n; i++) a[i] = scanner.nextInt();

for (int i = 1; i <= n; i++) da[i] = scanner.nextInt();

for (int i = 2; i <= n; i++) ta[i] = ta[i - 1] + scanner.nextInt(); // 优化为前缀和

T = scanner.nextInt();

int res = 0;

for (int k = 1; k <= n; k++) { // 枚举最远到达的鱼塘

int t = T - ta[k], total = 0;

for (int i = 1; i <= k; i++) pq.add(new Pair(a[i], da[i])); // 添加鱼塘初始值

while (t > 0) {

Pair temp = pq.poll();

total += temp.l; // 取最大的一个数 加到总和 并更新当前获得值 添加回队列

pq.add(new Pair(Math.max(0, temp.l - temp.r), temp.r));

t--; // 每钓上一次鱼 时间-1

}

pq.clear(); // 枚举完一轮 清空队列

res = Math.max(res, total);

}

System.out.println(res);

}

}

java买房子钓鱼,AcWing 1262. 鱼塘钓鱼(Java 贪心 Or 优先队列)相关推荐

  1. Acwing 1262.鱼塘钓鱼

    https://www.acwing.com/problem/content/1264/ 好像没有视频讲解,自己想了想,我用了一个叫堆的东西,把我想要的东西去贪心出来. #include<ios ...

  2. java题算工资,AcWing 3238. 工资计算java

    编程写不了,只能直接手算出来了..... 数据说明:若超过起征点最多达到1500,最多需要交45的税 若超过起征点最多达到4500,最多需要交345的税 import java.util.Scanne ...

  3. 鱼塘钓鱼(信息学奥赛一本通-T1373)

    [题目描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,--,第5分钟以后再 ...

  4. 鱼塘钓鱼 优先队列 多路归并排序 贪心

    鱼塘钓鱼 优先队列 多路归并排序 贪心 优先队列介绍 贪心思想:不会回头 解题思想:枚举0-N-1目的地鱼塘k, 如图 从上到下 选t(钓鱼的时间)个数,使和最大 #include<iostre ...

  5. 1373:鱼塘钓鱼(fishing)——优先队列+贪心

    [题目描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,--,第5分钟以后再 ...

  6. 【一本通评测 1373】【堆】【贪心】鱼塘钓鱼

    鱼塘钓鱼 题目 解题思路 Code 一本通评测 1373:鱼塘钓鱼(fishing) 题目 [题目描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 鱼 ...

  7. SSL 2331 洛谷 1717 信息学奥赛一本通 1373 鱼塘钓鱼#贪心#

    动态规划 温馨提示:交洛谷请在总时间*12并调整输入格式. 题目 设计一个钓鱼方案,从第1个鱼塘出发,希望能钓到最多的鱼. 分析 首先是贪心,最后在第i个鱼塘钓鱼的话,那么路上的时间是固定的,所以也可 ...

  8. 【c++一本通】【堆】鱼塘钓鱼

    [c++一本通][堆]鱼塘钓鱼 题目 解题思路 枚举去到的最远的鱼塘 减去花费在路程上的时间,剩下的就是用来钓鱼的时间 将能到达的鱼塘初始的鱼,加入堆 然后取出堆顶,加入其下一次钓到的鱼的数量 直到时 ...

  9. 堆——鱼塘钓鱼:简直爽!

    我人生中的第一篇博客:想想还有点小激动呢! 鱼塘钓鱼(fishing) [问题描述]      有N个鱼塘排成一排(N<100),在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8 ...

最新文章

  1. 如何查看python安装位置图_怎么查看python安装路径
  2. 数位dp 记忆化搜索java_hdu 5787 数位dp,记忆化搜索
  3. 在python函数中参数分类的详细教程
  4. Mysql 重做日志及与二进制日志的区别
  5. 哪些代码设计看似是面向对象,实际是面向过程的?
  6. logisim无法打开解决办法
  7. 永远不要去依赖别人_心理学:永远不要穿别人剩下的旧衣服,这三点原因读来让人愧疚...
  8. Intel 中断和异常处理 - 目录
  9. 计算机网络连接设备不见了,怎么办电脑网络连接不见了
  10. Ubuntu下编译vtk(java版本)【超详细-带过程截图】
  11. uniapp app 腾讯云 IM 通讯 封装基础登录方法
  12. 前端基础知识总结 (三)
  13. 如何为您的客户创造价值?
  14. Vue2.0+组件库总结
  15. SQL查询左连接、右连接、内连接
  16. excel表格如何转换成word表格_还不会转换格式?教你一招,Excel表格完美转换成Word文档...
  17. 用Leangoo管理用户故事
  18. DIY 3D打印机——【有啥用啥版】
  19. MySQL: 垂直分片
  20. 计算思维(1)-质因数

热门文章

  1. ajax练习,AJAX 自学练习 请求与显示
  2. PHP输出控制函数介绍
  3. 3DMAX设置鼠标命令快捷键
  4. eggs和egg是什么意思_7种西餐中鸡蛋的常见做法和叫法
  5. idea替换字符串的快捷键
  6. 使用Prometheus+Alertmanager告警JVM异常情况
  7. 大数据工程师培训机构如何选择
  8. 无法同步谷歌日历_简单几步,将2020年天象导入你的手机日历
  9. 析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?
  10. 实验2-Python数据预处理