2022-09-21:有n个动物重量分别是a1、a2、a3…an,
这群动物一起玩叠罗汉游戏,
规定从左往右选择动物,每只动物左边动物的总重量不能超过自己的重量
返回最多能选多少个动物,求一个高效的算法。
比如有7个动物,从左往右重量依次为:1,3,5,7,9,11,21
则最多能选5个动物:1,3,5,9,21
注意本题给的例子是有序的,但是实际给定的动物数组,可能是无序的,
要求从左往右选动物,且不能打乱原始数组。

答案2022-09-21:

联想到最长递增子序列。动态规划+二分。
时间复杂度O(N*logN)。
额外空间复杂度O(N)。

代码用rust编写。代码如下:

use rand::Rng;
fn main() {
let nn = 100;
let vv = 1000;
let test_time = 2000;
println!("测试开始");
for _ in 0..test_time {
let n = rand::thread_rng().gen_range(0, nn) + 1;
let mut arr = random_array(n, vv);
let ans1 = max_animals1(&mut arr);
let ans2 = max_animals2(&mut arr);
if ans1 != ans2 {
println!("出错了");
println!("{:?}", arr);
println!("");
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
break;
}
}
println!("测试结束");
} // 普通动态规划
// 非常一般的方法
// 来自背包的思路
fn max_animals1(arr: &mut Vec<i32>) -> i32 {
let mut sum = 0;
for num in arr.iter() {
sum += *num;
}
let mut dp: Vec<Vec<i32>> = vec![];
for i in 0..arr.len() as i32 {
dp.push(vec![]);
for _ in 0..sum + 1 {
dp[i as usize].push(0);
}
}
for i in 0..arr.len() as i32 {
for j in 0..=sum {
dp[i as usize][j as usize] = -1;
}
}
return process1(arr, 0, 0, &mut dp);
} fn process1(arr: &mut Vec<i32>, index: i32, pre: i32, dp: &mut Vec<Vec<i32>>) -> i32 {
if index == arr.len() as i32 {
return 0;
}
if dp[index as usize][pre as usize] != -1 {
return dp[index as usize][pre as usize];
}
let p1 = process1(arr, index + 1, pre, dp);
let mut p2 = 0;
if arr[index as usize] >= pre {
p2 = 1 + process1(arr, index + 1, pre + arr[index as usize], dp);
}
let ans = get_max(p1, p2);
dp[index as usize][pre as usize] = ans;
return ans;
} // 最优解
// 如果arr长度为N,时间复杂度O(N*logN)
fn max_animals2(arr: &mut Vec<i32>) -> i32 {
if arr.len() == 0 {
return 0;
}
// ends数组
let mut ends: Vec<i32> = vec![];
for _ in 0..arr.len() + 1 {
ends.push(0);
}
ends[0] = 0;
let mut ends_size = 1;
let mut max: i32 = 1;
for i in 0..arr.len() as i32 {
let mut l: i32 = 0;
let mut r: i32 = ends_size - 1;
let mut m: i32;
let mut find: i32 = 0;
while l <= r {
m = (l + r) / 2;
if ends[m as usize] <= arr[i as usize] {
find = m;
l = m + 1;
} else {
r = m - 1;
}
}
if find == ends_size - 1 {
ends[ends_size as usize] = ends[(ends_size - 1) as usize] + arr[i as usize];
ends_size += 1;
} else {
if ends[(find + 1) as usize] > ends[find as usize] + arr[i as usize] {
ends[(find + 1) as usize] = ends[find as usize] + arr[i as usize];
}
}
max = get_max(max, find + 1);
}
return max;
} fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
} // 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> {
let mut arr: Vec<i32> = vec![];
for _ in 0..n {
arr.push(rand::thread_rng().gen_range(0, v) + 1);
}
return arr;
}

执行结果如下:


左神java代码

2022-09-21:有n个动物重量分别是a1、a2、a3.....an, 这群动物一起玩叠罗汉游戏, 规定从左往右选择动物,每只动物左边动物的总重量不能超过自己的重量 返回最多能选多少个动物,求一个的更多相关文章

  1. ZT 感触的屌丝职场记 投递人 itwriter 发布于 2013-05-27 09:21 评论(18) 有3402人阅读 原文链接 [收藏] « »   作者@幻想哥呀幻想哥   有一位屌丝男,从小抱着报效祖国的理想上了大学,毕业后干了 IT 行业,高中那时候看文汇报说,搞 IT 的在上

    屌丝职场记 投递人 itwriter 发布于 2013-05-27 09:21 评论(18) 有3402人阅读  原文链接  [收藏]  « » 作者@幻想哥呀幻想哥 有一位屌丝男,从小抱着报效祖国的 ...

  2. 2022.02.21 UB

    2022.02.21 UB 参考资料: https://zhuanlan.zhihu.com/p/141467895 https://blog.csdn.net/ghscarecrow/article ...

  3. 2022.02.21 SA

    2022.02.21 SA 当我年少轻狂时,我曾拥有自由,但我并不明白它的意义.我曾拥有时间,但我没有意识到它的珍贵.我曾拥有爱,但我从未用心去体会.数十年的时间考验后,我终于理解了三者的真谛. 我已 ...

  4. Dapr中国社区活动之 分布式运行时开发者日 (2022.09.03)

    自2019年10月首次发布以来,Dapr(Distributed Application Runtime,分布式应用运行时)因其"更稳定"."更可靠".&quo ...

  5. 编程写一个方法时,注意方法中传参数的数量最好不要超过5个,超过5个怎么办?可以用struct或class,或一个字典类

    图  1 一.从图1发现了什么问题呢? 答案:1.参数传的的太多了:2.另外注释也没写好. 说明:一个方法中,传参数的数量最好不要超过5个. 应该采用:struct或class,或一个字典类都行.其中 ...

  6. Zedboard学习(三):PL下流水灯实验 标签: fpgazynqPL 2017-07-05 11:09 21人阅读 评论(0)

    zynq系列FPGA分为PS部分和PL部分. PL: 可编程逻辑 (Progarmmable Logic), 就是FPGA部分. PS: 处理系统 (Processing System) , 就是与F ...

  7. MISC 2022/4/21 刷题记录-千字文

    1.千字文 得到名为png的无类型文件,010 Editor查看,png,改后缀,得到二维码 QR扫描,得到一句话"这里只有二维码" 思路不对,binwalk一下,发现有错误信息 ...

  8. Cheatsheet: 2013 09.10 ~ 09.21

    .NET Lucene.Net – Custom Synonym Analyzer Using FiddlerCore to Capture Streaming Audio Immutable col ...

  9. 2016/09/21 java关键字static

    1.static方法     static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上th ...

  10. 2016/09/21 Java关键字final

    1.final类 final类不能被继承,没有子类,final类中的方法默认是final的. final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的. 2.final方 ...

随机推荐

  1. POI给单元格添加超链接(xls,xlsx)

    package com.topcheer.html; import java.io.FileOutputStream; import java.io.IOException; import org.a ...

  2. Eclipse使用Maven搭建SSM框架时遇到的问题以及解决办法

    1.新建项目后出现:Could not caculate build plan:plugin 解决方法:删除本地.m2仓库中 org.apache.maven.plugins:maven-resour ...

  3. 使用ipmitool配置ipmi(远程控制卡)

    使用ipmitool配置ipmi(远程控制卡) 在centos安装OpenIPMI: yum install OpenIPMI OpenIPMI-tools 设置开机启动 chkconfig ipmi ...

  4. 继续Vue的探索

    接上集 上次到了想要利用Vue实现隔行变色的请求,但是由于使用的代码过于"高级"导致无法识别,这就需要利用webpack来解决它! webpack的基本使用 1.首先,在项目中安装 ...

  5. VMware虚拟机扩容--保姆级教学

    由于项目逐步的完善,需要搭建的中间件,软件越来越多,导致以前虚拟机配置20G的内存不够用了,又不想重新创建新的虚拟机,退而求更精,选择扩容. 1.外部先进入虚拟机设置,将磁盘先扩展,具体提示如下图所示 ...

  6. CF1286F Harry The Potter

    CF1286F Harry The Potter 首先答案上界为 \(n\),就是对每个点用一次操作 1. 那么我们现在的思维模式就是利用操作 2 来减少操作 1 的次数. 不难发现,如果操作 2 的 ...

  7. Spring配置类为什么要分Full和Lite模式

    本文基于Spring 5.2.15-RELEASE 关于Spring配置类的Full模式和Lite模式,如果没有仔细阅读过源码或者官方文档的话,估计很多人都不知道这个概念.所以我们先来解释下这两个概念 ...

  8. go语言之UDP通信

    服务端 package main import ( "fmt" "net" ) func main() { listen, err := net.ListenU ...

  9. 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法 | 欧拉函数 | 数论

    DAY10共2题: 月月给华华出题 华华给月月出题 难度较大. 作者:Eriktse 简介:211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python ...

  10. Django之数据库操作入门

    目录 pycharm连接mysql数据库 pycharm与数据库图形化交互方式 pycharm后台连接数据库 django连接数据库报错 ORM简介 ORM建表 ORM入门之增删改查 ORM写数据 O ...