2022-11-09:给定怪兽的血量为hp
第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果
第i回合如果用毒,怪兽在这回合不会掉血,
但是之后每回合都会掉血,并且所有中毒的后续效果会叠加
给定的两个数组cuts、poisons,两个数组等长,长度都是n
表示你在n回合内的行动,
每一回合的刀砍的效果由cuts[i]表示
每一回合的中毒的效果由poisons[i]表示
如果你在n个回合内没有直接杀死怪兽,意味着你已经无法有新的行动了
但是怪兽如果有中毒效果的话,那么怪兽依然会在hp耗尽的那回合死掉。
返回你最快能在多少回合内将怪兽杀死。
数据范围 :
1 <= n <= 10的5次方
1 <= hp <= 10的9次方
1 <= cuts[i]、poisons[i] <= 10的9次方。

答案2022-11-09:

二分答案法。
时间复杂度:O(N * log(hp))。
额外空间复杂度:O(1)。

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

use rand::Rng;
use std::iter::repeat;
fn main() {let nn: i32 = 30;let cut_v = 20;let posion_v = 10;let hp_v = 200;let test_time: i32 = 10000;println!("测试开始");for i in 0..test_time {let n = rand::thread_rng().gen_range(0, nn) + 1;let mut cuts = random_array(n, cut_v);let mut posions = random_array(n, posion_v);let hp = rand::thread_rng().gen_range(0, hp_v) + 1;let ans1 = fast1(&mut cuts, &mut posions, hp);let ans2 = fast2(&mut cuts, &mut posions, hp);if ans1 != ans2 {println!("cuts = {:?}", cuts);println!("posions = {:?}", posions);println!("i = {:?}", i);println!("ans1 = {:?}", ans1);println!("ans2 = {:?}", ans2);println!("出错了!");break;}}println!("测试结束");
}// 不算好的方法
// 为了验证
fn fast1(cuts: &mut Vec<i32>, poisons: &mut Vec<i32>, hp: i32) -> i32 {let mut sum = 0;for num in poisons.iter() {sum += *num;}let mut dp: Vec<Vec<Vec<i32>>> = repeat(repeat(repeat(0).take((sum + 1) as usize).collect()).take((hp + 1) as usize).collect(),).take(cuts.len()).collect();return process1(cuts, poisons, 0, hp, 0, &mut dp);
}fn process1(cuts: &mut Vec<i32>,poisons: &mut Vec<i32>,index: i32,mut rest_hp: i32,poison_effect: i32,dp: &mut Vec<Vec<Vec<i32>>>,
) -> i32 {rest_hp -= poison_effect;if rest_hp <= 0 {return index + 1;}// restHp > 0if index == cuts.len() as i32 {if poison_effect == 0 {return i32::MAX;} else {return cuts.len() as i32 + 1 + (rest_hp + poison_effect - 1) / poison_effect;}}if dp[index as usize][rest_hp as usize][poison_effect as usize] != 0 {return dp[index as usize][rest_hp as usize][poison_effect as usize];}let p1 = if rest_hp <= cuts[index as usize] {index + 1} else {process1(cuts,poisons,index + 1,rest_hp - cuts[index as usize],poison_effect,dp,)};let p2 = process1(cuts,poisons,index + 1,rest_hp,poison_effect + poisons[index as usize],dp,);let ans = get_min(p1, p2);dp[index as usize][rest_hp as usize][poison_effect as usize] = ans;return ans;
}fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {if a < b {a} else {b}
}fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {if a > b {a} else {b}
}// 真正想实现的方法
// O(N * log(hp))
fn fast2(cuts: &mut Vec<i32>, poisons: &mut Vec<i32>, hp: i32) -> i32 {// 怪兽可能的最快死亡回合let mut l = 1;// 怪兽可能的最晚死亡回合let mut r = hp + 1;let mut m: i32;let mut ans = i32::MAX;while l <= r {m = l + ((r - l) >> 1);if ok(cuts, poisons, hp as i64, m) {ans = m;r = m - 1;} else {l = m + 1;}}return ans;
}fn ok(cuts: &mut Vec<i32>, posions: &mut Vec<i32>, mut hp: i64, limit: i32) -> bool {let n = get_min(cuts.len() as i32, limit);let mut i = 0;let mut j = 1;while i < n {hp -= get_max(cuts[i as usize] as i64,(limit - j) as i64 * posions[i as usize] as i64,);if hp <= 0 {return true;}i += 1;j += 1;}return false;
}// 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> {let mut ans: Vec<i32> = vec![];for _ in 0..n {ans.push(rand::thread_rng().gen_range(0, v) + 1);}return ans;
}

执行结果如下:


左神java代码

2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给相关推荐

  1. 1.5 编程基础之循环控制 11 整数的个数(2022.01.09)--python

    http://noi.openjudge.cn/ch0105/11/ """ 1.5 编程基础之循环控制 11 整数的个数(2022.01.09) http://noi. ...

  2. 2022 . 11 . 26 测试赛解题报告

    2022 . 11 . 26测试赛 [USACO21DEC] Lonely Photo B 题目描述 Farmer John 最近购入了 NNN 头新的奶牛(3≤N≤5×1053 \le N \le ...

  3. 【跃迁之路】【636天】程序员高效学习方法论探索系列(实验阶段393-2018.11.09)...

    @(收集箱(每日一记,每周六整理))专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) ...

  4. Daily Report 2012/11/09 陈伯雄(step 9)

    今天的工作是完成把之前建立的倒排索引和数据库搜索匹配模块嵌入到主体工程中,等待运行和测试. 但是,现在的数据库搜索方法精度还不够,天真把每个关键词一视同仁地处理了,这样的后果可能回造成用户搜索体验不佳 ...

  5. 【02】2022.11最新超详细Vuforia图片识别教程

    [02]2022.11最新超详细Vuforia图片识别教程 文章目录 [02]2022.11最新超详细Vuforia图片识别教程 1.Vuforia环境搭建 2.License Key获取及注册 3. ...

  6. Serv-U的反弹攻击及其利用时间:2006-12-20 11:09来源:中国网管联盟 作者:网管整理 点击:899次...

    Serv-U的反弹攻击及其利用时间:2006-12-20 11:09来源:中国网管联盟 作者:网管整理 点击:899次     FTP反弹攻击(FTP Bounce Attack)是很古老的技术了,居 ...

  7. 计量经济学-多元回归-2022.11

    计量经济学-多元回归-2022.11 注意: 一.请在此文档的基础上在每一问之后输入答案,编辑为word文档的一个整体报告,上传到智慧树. 二.散点图(截屏或下载)嵌入到报告里. 三.回答每一个问题都 ...

  8. 生物医药实验室安全知识202203第八次作业答案(2022.11.11)

    生物医药实验室安全知识202203第八次作业答案(2022.11.11) 2022年11月 生物医药实验室安全知识202203第八次作业答案(2022.11.11)

  9. 生物医药实验室安全知识202203第六次作业答案(2022.11.11)

    生物医药实验室安全知识202203第六次作业答案(2022.11.11) 2022年11月 生物医药实验室安全知识202203第六次作业答案(2022.11.11)

最新文章

  1. ipad php mysql_如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
  2. Mac-ios下JDK的安装路径(java)
  3. 接口测试学习——jmeter分布式压测
  4. Maven Tomcat 部署
  5. .Net Core 微服务容器系列基础目录篇
  6. SQL事务控制语言(TCL)
  7. python 魔法函数是什么意思_Python 中的魔法函数
  8. enityframework 已连接的当前状态为打开。_关于性能优化 从tcp建立连接amp;断开的视角...
  9. mfc opengl 三维地形图_衢州三维动画制作传媒企业哪家好2020收费
  10. 我的IBM本本逃过一劫...
  11. 自我与人际沟通课程复习
  12. 贪吃蛇程序设计报告python_贪吃蛇程序设计报告
  13. 太阳能计算机屏幕是什么材质,电脑显示器表面是什么材质的 什么是液晶玻璃...
  14. 百度有道谷歌api集成批量翻译器
  15. JAVA中的ZoneId常用值备注
  16. 职业学校计算机专业好吗,计算机专业就业前景好不
  17. MNIST数据集手写数字识别
  18. 在 Vue3 成为默认版本后,盘点了 Vue3 与 Vue2 的区别
  19. 2D变形:平移、旋转、缩放、倾斜
  20. 修改nz-select中的nz-option设置title属性展示内容。

热门文章

  1. 学习Python的第四天
  2. 关于猫鼻支的防范和治疗
  3. 手机摄影-参数(光圈)
  4. 设置windows开机隐藏启动,隐藏欢迎界面
  5. html,css,js,简单的网页留言板
  6. RK3588 实现温控风扇之获取cpu温度(一)
  7. Centos7修改DNS教程
  8. 最新阿里巴巴面试题合集附带答案,答对70%你也可以进阿里(天猫+蚂蚁金服+阿里巴巴)
  9. 宝宝培养 IOS APP 上线
  10. bagging通过bootstrap构建集成分类器