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 > 0
if 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. 2022.11.09 NOIP2022 模拟赛六

    科学 Source:CF461C Appleman and a Sheet of Paper,*2200. 注意到对于 \(p\le \lfloor \frac {now}{2}\rfloor\),直 ...

  2. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

  3. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  4. 2021.11.09 P3435 [POI2006]OKR-Periods of Words(KMP)

    2021.11.09 P3435 [POI2006]OKR-Periods of Words(KMP) https://www.luogu.com.cn/problem/P3435 题意: 对于一个仅 ...

  5. ACM阶段总结(2016.10.07-2016.11.09)

    来这里也有一段时间了…… 总感觉自己练得不是很有效. 最近的一些行动就是不断做比赛,然后不停地补,但是感觉这样像只无头苍蝇,没有效果,学不到什么真正的东西. 最近开始打算补专题,做做codeforce ...

  6. 2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP)

    2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP) https://www.luogu.com.cn/problem/P3426 题意: 你打算在纸上印一串字 ...

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

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

  8. 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)

    传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...

  9. 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)

    传送门 先把边双连通分量用圆方树一样的方法缩点,然后把新建的树树剖维护. 注意对于边双连通分量需要维护动态最小值,可以用multisetmultisetmultiset. 代码: #include&l ...

  10. 2018.11.09 bzoj4773: 负环(倍增+floyd)

    传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...

随机推荐

  1. 使用yarn启用项目,报错无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系 统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。

    这是由于新版win10 安装的时候会出现: 解决 搜索powershell,右键以管理员身份运行 2.打开之后,执行命令set-ExecutionPolicy RemoteSigned更改 Power ...

  2. Spring MVC 和 Struts 的区别是什么?

    1. 拦截机制的不同 Struts2 是类级别的拦截,每次请求就会创建一个 Action,和 Spring 整合时 Struts2 的 ActionBean 注入作用域是原型模式 prototype, ...

  3. SICP:求值和环境模型(Python实现)

    绪论 我们在第一章引进复合过程时,采用了求值的代换模型定义了将过程应用于实参(arguments)的意义: 将一个复合过程应用于一些实参,也就意味着用实参替换过程体里对应的形参(formal para ...

  4. 器学习算法(六)基于天气数据集的XGBoost分类预测

    1.机器学习算法(六)基于天气数据集的XGBoost分类预测 1.1 XGBoost的介绍与应用 XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统.严格意义上讲XGBo ...

  5. Chronicle Pro - 一款简单 Mac 理财规划师,管理你的的个人预算

    使用Chronicle追踪和支付账单,管理你的个人预算,这是一款简单的Mac理财规划师.获得通知,这样你就不会错过下一个付款截止日期;你再也不用付滞纳金了.把你所有的账单放在一起,计划.检查和分析它们 ...

  6. SQL Server底层架构技术对比

    背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...

  7. ASP.NET Core - 选项系统之选项验证

      就像 Web Api 接口可以对入参进行验证,避免用户传入非法的或者不符合我们预期的参数一样,选项也可以对配置源的内容进行验证,避免配置中的值与选项类中的属性不对应或者不满足预期,毕竟大部分配置都 ...

  8. 集合-LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  9. Rancher(V2.6.3)安装K8s教程

    Rancher(V2.6.3)安装K8s教程 一,安装前环境准备: 1,升级Linux服务器内核 Ubuntu20.04: #查看当前内核版本 uname -rs #查看软件库中可下载的内核 sudo ...

  10. CentOS8删除boot目录恢复

    系统安装完之后,boot分区最好做一个备份,因为这个分区 我们基本不会动它,所以备份一次一劳永逸,以防万一.如果我们不小心 误删除了这个目录,也不用慌,正因为这个分区,我们除了开机 其他时候基本用不到 ...