java买房子钓鱼,AcWing 1262. 鱼塘钓鱼(Java 贪心 Or 优先队列)
算法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 优先队列)相关推荐
- Acwing 1262.鱼塘钓鱼
https://www.acwing.com/problem/content/1264/ 好像没有视频讲解,自己想了想,我用了一个叫堆的东西,把我想要的东西去贪心出来. #include<ios ...
- java题算工资,AcWing 3238. 工资计算java
编程写不了,只能直接手算出来了..... 数据说明:若超过起征点最多达到1500,最多需要交45的税 若超过起征点最多达到4500,最多需要交345的税 import java.util.Scanne ...
- 鱼塘钓鱼(信息学奥赛一本通-T1373)
[题目描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,--,第5分钟以后再 ...
- 鱼塘钓鱼 优先队列 多路归并排序 贪心
鱼塘钓鱼 优先队列 多路归并排序 贪心 优先队列介绍 贪心思想:不会回头 解题思想:枚举0-N-1目的地鱼塘k, 如图 从上到下 选t(钓鱼的时间)个数,使和最大 #include<iostre ...
- 1373:鱼塘钓鱼(fishing)——优先队列+贪心
[题目描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,--,第5分钟以后再 ...
- 【一本通评测 1373】【堆】【贪心】鱼塘钓鱼
鱼塘钓鱼 题目 解题思路 Code 一本通评测 1373:鱼塘钓鱼(fishing) 题目 [题目描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 鱼 ...
- SSL 2331 洛谷 1717 信息学奥赛一本通 1373 鱼塘钓鱼#贪心#
动态规划 温馨提示:交洛谷请在总时间*12并调整输入格式. 题目 设计一个钓鱼方案,从第1个鱼塘出发,希望能钓到最多的鱼. 分析 首先是贪心,最后在第i个鱼塘钓鱼的话,那么路上的时间是固定的,所以也可 ...
- 【c++一本通】【堆】鱼塘钓鱼
[c++一本通][堆]鱼塘钓鱼 题目 解题思路 枚举去到的最远的鱼塘 减去花费在路程上的时间,剩下的就是用来钓鱼的时间 将能到达的鱼塘初始的鱼,加入堆 然后取出堆顶,加入其下一次钓到的鱼的数量 直到时 ...
- 堆——鱼塘钓鱼:简直爽!
我人生中的第一篇博客:想想还有点小激动呢! 鱼塘钓鱼(fishing) [问题描述] 有N个鱼塘排成一排(N<100),在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8 ...
最新文章
- 如何查看python安装位置图_怎么查看python安装路径
- 数位dp 记忆化搜索java_hdu 5787 数位dp,记忆化搜索
- 在python函数中参数分类的详细教程
- Mysql 重做日志及与二进制日志的区别
- 哪些代码设计看似是面向对象,实际是面向过程的?
- logisim无法打开解决办法
- 永远不要去依赖别人_心理学:永远不要穿别人剩下的旧衣服,这三点原因读来让人愧疚...
- Intel 中断和异常处理 - 目录
- 计算机网络连接设备不见了,怎么办电脑网络连接不见了
- Ubuntu下编译vtk(java版本)【超详细-带过程截图】
- uniapp app 腾讯云 IM 通讯 封装基础登录方法
- 前端基础知识总结 (三)
- 如何为您的客户创造价值?
- Vue2.0+组件库总结
- SQL查询左连接、右连接、内连接
- excel表格如何转换成word表格_还不会转换格式?教你一招,Excel表格完美转换成Word文档...
- 用Leangoo管理用户故事
- DIY 3D打印机——【有啥用啥版】
- MySQL: 垂直分片
- 计算思维(1)-质因数