2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给
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;
}
执行结果如下:

2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给的更多相关文章
- 2022.11.09 NOIP2022 模拟赛六
		科学 Source:CF461C Appleman and a Sheet of Paper,*2200. 注意到对于 \(p\le \lfloor \frac {now}{2}\rfloor\),直 ... 
- 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 ... 
- 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
		2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ... 
- 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 题意: 对于一个仅 ... 
- ACM阶段总结(2016.10.07-2016.11.09)
		来这里也有一段时间了…… 总感觉自己练得不是很有效. 最近的一些行动就是不断做比赛,然后不停地补,但是感觉这样像只无头苍蝇,没有效果,学不到什么真正的东西. 最近开始打算补专题,做做codeforce ... 
- 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 题意: 你打算在纸上印一串字 ... 
- Zedboard学习(三):PL下流水灯实验                                                                                                         标签:               fpgazynqPL                                            2017-07-05 11:09             21人阅读              评论(0)
		zynq系列FPGA分为PS部分和PL部分. PL: 可编程逻辑 (Progarmmable Logic), 就是FPGA部分. PS: 处理系统 (Processing System) , 就是与F ... 
- 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)
		传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ... 
- 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)
		传送门 先把边双连通分量用圆方树一样的方法缩点,然后把新建的树树剖维护. 注意对于边双连通分量需要维护动态最小值,可以用multisetmultisetmultiset. 代码: #include&l ... 
- 2018.11.09 bzoj4773: 负环(倍增+floyd)
		传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ... 
随机推荐
- pycharm conmunity 2022.1没有mange repositories,只能使用命令方式修改镜像源(长期可信)
			https://blog.csdn.net/qq_43625764/article/details/124656990 
- element表格样式修改
			HTML代码: <el-table :data="tableData" style="width: 100%" border :row-class-nam ... 
- time命令详解
			Linux中time命令,我们经常用来计算某个程序的运行耗时,用户态cpu耗时,系统态cpu耗时. 例如: $ time foo real 0m0.003s user 0m ... 
- Stream 未释放系统资源问题处理
			Unreleased Resource: Streams Abstract 程序可能无法成功释放某一项系统资源. Explanation 程序可能无法成功释放某一项系统资源. 资源泄露至少有两种常见的 ... 
- SpringBoot——模板引擎及原理
			更多内容,前往IT-BLOG 一.模板引擎的思想 模板是为了将显示与数据分离,模板技术多种多样,但其本质都是将模板文件和数据通过模板引擎生成最终的 HTML代码. 二.SpringBoot模板引擎 S ... 
- Spring Data Solr 对 Solr 的增删改查实例
			Spring Data Solr 就是为了方便 solr 的开发研制的一个框架,其底层是对 SolrJ(官方 API)的封装 一.环境搭建 第一步:创建 Maven 项目(springdatasolr ... 
- 1 - Windows 10 - Python 类的常用高级系统函数(方法)通识
			@ 目录 一.系统函数__init__() 初始化类函数 二.系统函数__call__() 调用对象函数 三.系统函数__dict__类属性查询函数 四.系统函数__str__()描述类信息函数 五. ... 
- .NET周报 【3月第4期 2023-03-24】
			国内文章 .NET应用系统的国际化-多语言翻译服务 https://www.cnblogs.com/tianqing/p/17232559.html 本文重点介绍了多语言翻译服务的设计和实现.文章描述 ... 
- vulnhub靶场之HACKSUDO: 2 (HACKDUDO)
			准备: 攻击机:虚拟机kali.本机win10. 靶机:hacksudo: 2 (HackDudo),下载地址:https://download.vulnhub.com/hacksudo/hackdu ... 
- vue3中watch的写法大合集。
			VUE2的watch是一个属性写法是 watch:{ data1(newVal,oldVal){ 同步/异步操作 } } VUE3的watch则是一个函数,写法是 注意数据必须是响应式的 let nu ... 
