2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己小的鱼的事件是同时发生的。 返回多少轮之
2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。
每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼,
并且每条鱼吃比自己小的鱼的事件是同时发生的。
返回多少轮之后,鱼的数量会稳定。
注意:6 6 3 3。
第一轮过后 :
对于两个6来说,右边比自己小的第一条鱼都是第1个3,所以只有这个3被吃掉,
数组变成 : 6 6 3(第2个3),
第二轮过后 : 6 6。
返回2。
来自bilibili。
答案2022-05-27:
单调栈。
代码用rust编写。代码如下:
use rand::Rng;
fn main() {
let len: i32 = 50;
let value: i32 = 20;
let test_time: i32 = 20000;
println!("测试开始");
for _i in 0..test_time {
let n: i32 = rand::thread_rng().gen_range(0, len) + 1;
let mut arr = random_array(n, value);
let mut arr2 = arr.clone();
let ans1 = min_turns1(&mut arr);
let ans2 = min_turns2(&mut arr2);
if ans1 != ans2 {
println!("出错了!");
print!("arr = {:?}", arr);
println!("");
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
break;
}
}
println!("测试结束");
}
fn min_turns1(arr: &mut Vec<i32>) -> i32 {
let mut ans: i32 = 0;
loop {
let rest = eat_rest(arr);
if arr.len() == rest.len() {
break;
}
*arr = rest;
ans += 1;
}
return ans;
}
fn eat_rest(arr: &mut Vec<i32>) -> Vec<i32> {
if arr.len() == 0 {
return vec![0];
}
let n = arr.len() as i32;
let mut delete: Vec<bool> = vec![];
for _i in 0..n {
delete.push(false);
}
let mut len = n;
for i in 0..n {
for j in i + 1..n {
if arr[i as usize] > arr[j as usize] {
if !delete[j as usize] {
delete[j as usize] = true;
len -= 1;
}
break;
}
}
}
let mut rest: Vec<i32> = vec![];
for _i in 0..len {
rest.push(0);
}
let mut j: i32 = 0;
for i in 0..n {
if !delete[i as usize] {
rest[j as usize] = arr[i as usize];
j += 1;
}
}
return rest;
}
fn min_turns2(arr: &mut Vec<i32>) -> i32 {
let n = arr.len() as i32;
let mut stack: Vec<Vec<i32>> = vec![];
for i in 0..n {
stack.push(vec![]);
for _j in 0..2 {
stack[i as usize].push(0);
}
}
let mut stack_size: i32 = 0;
let mut ans = 0;
let mut i = n - 1;
while i >= 0 {
let mut cur_ans = 0;
while stack_size > 0 && stack[(stack_size - 1) as usize][0] < arr[i as usize] {
stack_size -= 1;
cur_ans = get_max(cur_ans + 1, stack[stack_size as usize][1]);
}
stack[stack_size as usize][0] = arr[i as usize];
stack[stack_size as usize][1] = cur_ans;
stack_size += 1;
ans = get_max(ans, cur_ans);
i -= 1;
}
return ans;
}
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 _i in 0..n {
arr.push(rand::thread_rng().gen_range(0, v) - rand::thread_rng().gen_range(0, v));
}
return arr;
}
执行结果如下:

2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己小的鱼的事件是同时发生的。 返回多少轮之的更多相关文章
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 仿造slither.io第一步:先画条蛇
前言 最近 slither.io 貌似特别火,中午的时候,同事们都在玩,包括我自己也是玩的不亦乐乎. 好久好久没折腾过canvas相关的我也是觉得是时候再折腾一番啦,所以就试着仿造一下吧.楼主也没写过 ...
- 我的第一篇博文:C++最初的路-经典的小游戏走迷宫
写在开始:这个博客建于大二下学期.2年多的学习,从网上借鉴的大牛经验,代码,指导数不胜数,而其中大部分来自别人的博客,于是期待有一天也能把自己在学习过程中的一些经验拿出来与大家分享. 其实我凝望了C+ ...
- 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏
内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...
- 项目Beta冲刺(团队)——05.27(5/7)
项目Beta冲刺(团队)--05.27(5/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第5 ...
- Kendo UI for jQuery自定义小部件第一弹!不得不看的入门指南
Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...
- 2022.02.27 CF811E Vladik and Entertaining Flags
2022.02.27 CF811E Vladik and Entertaining Flags https://www.luogu.com.cn/problem/CF811E Step 1 题意 在一 ...
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- 自定义View4-塔防小游戏第一篇:一个防御塔+多个野怪(简易版)*
塔防小游戏 第一篇:一个防御塔+多个野怪(简易版) 1.canvas画防御塔,妖怪大道,妖怪行走路线 2.防御塔攻击范围是按照妖怪与防御塔中心距离计算的,大于防御塔半径则不攻击,小于则攻击 ...
- 微信小程序第一步
微信小程序开发文档https://developers.weixin.qq.com/miniprogram/dev/#小程序简介
随机推荐
- psq强制携带-h
背景: pg更新后psql 指令必须携带 -h指令,导致很多直接使用"psql"的shell脚本无法连接. 方案: 1.挨个更新调用psql的地方: 显然太多了,改不过来. 2.新 ...
- GPU Skinning
这个工具的作用是同一种角色在同屏里面出现一大堆时,可以大幅度的降低DrawCall.我试了一下,感觉挺有意思的,各位可以试试.它的原理实际上是把骨骼矩阵存在配置文件里面,然后通过特殊的shader,计 ...
- Android笔记--FileProvider
FileProvider介绍 继承于ContentProvider,本质上依旧是用于跨境通信,对第三方应用暴露文件,并授予文件读写地权限 具体内容 1.在Strings.xml里面配置一个常量 2.在 ...
- Android日常--今日的APP进度+1
学了这么久的APP,是时候拿出来实践一下啦! 今天洗的内容都比较基础,基本上不涉及到后台代码的编写,看到本阶段的目标需要连接数据库,也是有被震住哈哈哈哈哈: 我发现,第一阶段主要分为两个界面,第一个注 ...
- JavaWeb学习笔记第三弹
一.数据库设计 1.软件研发步骤 2.数据库设计概念 建立数据库中的表结构以及表与表之间的关联关系的过程 3.数据库设计的步骤 表关系:一对一.一对多(多对一).多对多 表关系之一对多 表关系之多对多 ...
- fortify Unsafe JNI
Unsafe JNI 主要解决问题: 1.system.currentTimeMillis(); 使用SystemClock.now()替换. 2.isAssignableFrom(); 使用新定义的 ...
- Teamcenter_NX集成开发:UF_UGMGR_invoke_pdm_server函数的使用
之前了解到通过UFUN函数UF_UGMGR_invoke_pdm_server可以调用Teamcenter ITK函数,从而可以获取及编辑Teamcenter对象.UFUN中有样例代码,但是就是不知道 ...
- Mac 音频转换器推荐 DRmare Audio Converter、Audi Free Auditor
给大家推荐两款 Mac 上的音频转换器,这两款转换器都可以转换苹果音乐,iTunes歌曲或者一些常规的音轨到MP3, FLAC, WAV, M4A, AAC格式等等,转换后我们就可以在所有的设备和播放 ...
- 浅谈Vue 2.x当中组件之间传值方式
一.父子之间传值 1. 父传子 :props <!DOCTYPE html> <html lang="en"> <head> <meta ...
- es6中clss做了些什么 怎么继承
我的理解是clss实际是一种语法糖 凡是es6中clss能做的 我们通过es5也同样可以完成传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性 ...