2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能,

每一个技能会有一个伤害,

同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害,

每一个技能最多只能释放一次,已知怪物有m点血量。

现在想问你最少用几个技能能消灭掉他(血量小于等于0)。

技能的数量是n,怪物的血量是m,

i号技能的伤害是x[i],i号技能触发双倍伤害的血量最小值是y[i]。

1 <= n <= 10,

1 <= m、x[i]、y[i] <= 10^6。

答案2024-01-13:

来自左程云

灵捷3.5

大体过程如下:

1.读取输入数据,包括技能数量 n、怪物血量 m,以及每个技能的伤害和触发双倍伤害的血量阈值。

2.定义一个递归函数 f(n, i, rest) 来求解最少使用多少个技能能够消灭怪物。其中,n 表示当前剩余的技能数量,i 表示当前考虑的技能索引,rest 表示剩余的怪物血量。

3.在递归函数 f 中,先判断如果剩余血量 rest 小于等于 0,则返回当前已使用技能的数量 i,表示已经成功消灭怪物。

4.继续判断如果技能索引 i 等于技能数量 n,则说明已经考虑完所有技能,但仍无法消灭怪物,返回一个较大的数值作为无解情况的标识。

5.初始化一个变量 ans 为一个较大的数值,用于记录最小使用技能数量。然后进入循环,从第 i 个技能开始尝试使用不同的技能。

6.在循环中,交换第 i 个技能和当前技能索引 j 对应的技能,以模拟尝试使用该技能。

7.判断如果剩余血量 rest 大于当前技能要求的血量触发双倍伤害的阈值 blood[i],则调用递归函数 f(n, i+1, rest-kill[i]),即不使用双倍伤害的情况下消灭怪物。

8.否则,调用递归函数 f(n, i+1, rest-kill[i]*2),即使用双倍伤害的情况下消灭怪物。

9.根据递归函数返回的结果,更新 ans 的最小值。

10.恢复交换前的技能顺序,保持数组的原始状态。

11.循环结束后,返回 ans 作为最终的结果。

总的时间复杂度为 O(n!),因为要求所有可能的技能使用组合。

额外空间复杂度为 O(n),主要是递归调用栈的空间。

go完整代码如下:

package main

import (
"fmt"
) const MAXN = 11 var kill [MAXN]int
var blood [MAXN]int func main() {
inputs := []int{3,
3, 100,
10, 20,
45, 89,
5, 40,
3, 100,
10, 20,
45, 90,
5, 40,
3, 100,
10, 20,
45, 84,
5, 40}
ii := 0
t := inputs[ii]
ii++
for i := 0; i < t; i++ {
n := inputs[ii]
ii++
m := inputs[ii]
ii++
for j := 0; j < n; j++ {
kill[j] = inputs[ii]
ii++
blood[j] = inputs[ii]
ii++
}
ans := f(n, 0, m)
if ans == int(^uint(0)>>1) {
fmt.Println(-1)
} else {
fmt.Println(ans)
}
} } func f(n, i, rest int) int {
if rest <= 0 {
return i
}
if i == n {
return int(^uint(0) >> 1)
}
ans := int(^uint(0) >> 1)
for j := i; j < n; j++ {
swap(i, j)
if rest > blood[i] {
ans = min(ans, f(n, i+1, rest-kill[i]))
} else {
ans = min(ans, f(n, i+1, rest-kill[i]*2))
}
swap(i, j)
}
return ans
} func swap(i, j int) {
kill[i], kill[j] = kill[j], kill[i]
blood[i], blood[j] = blood[j], blood[i]
} func min(a, b int) int {
if a < b {
return a
}
return b
}

rust完整代码如下:

const MAXN: usize = 11;

static mut KILL: [i32; MAXN] = [0; MAXN];
static mut BLOOD: [i32; MAXN] = [0; MAXN]; fn main() {
let inputs = [
3, 3, 100, 10, 20, 45, 89, 5, 40, 3, 100, 10, 20, 45, 90, 5, 40, 3, 100, 10, 20, 45, 84, 5,
40,
]; let mut ii = 0;
let t = inputs[ii as usize];
ii += 1; for _ in 0..t {
let n = inputs[ii as usize];
ii += 1;
let m = inputs[ii as usize];
ii += 1; unsafe {
for j in 0..n {
KILL[j as usize] = inputs[ii as usize];
ii += 1;
BLOOD[j as usize] = inputs[ii as usize];
ii += 1;
}
} let ans = f(n, 0, m);
if ans == std::i32::MAX {
println!("-1");
} else {
println!("{}", ans);
}
}
} fn f(n: i32, i: i32, rest: i32) -> i32 {
if rest <= 0 {
return i as i32;
} if i == n {
return std::i32::MAX;
} unsafe {
let mut ans = std::i32::MAX; for j in i..n {
swap(i, j); if rest > BLOOD[i as usize] {
ans = min(ans, f(n, i + 1, rest - KILL[i as usize]));
} else {
ans = min(ans, f(n, i + 1, rest - KILL[i as usize] * 2));
} swap(i, j);
} ans
}
} fn swap(i: i32, j: i32) {
unsafe {
let temp_k = KILL[i as usize];
let temp_b = BLOOD[i as usize]; KILL[i as usize] = KILL[j as usize];
BLOOD[i as usize] = BLOOD[j as usize]; KILL[j as usize] = temp_k;
BLOOD[j as usize] = temp_b;
}
} fn min(a: i32, b: i32) -> i32 {
if a < b {
a
} else {
b
}
}

c++完整代码如下:

#include <iostream>
#include <limits.h>
using namespace std; const int MAXN = 11; int kill[MAXN];
int blood[MAXN]; int f(int n, int i, int rest) {
if (rest <= 0) {
return i;
}
if (i == n) {
return INT_MAX;
}
int ans = INT_MAX;
for (int j = i; j < n; j++) {
swap(kill[i], kill[j]);
swap(blood[i], blood[j]);
if (rest > blood[i]) {
ans = min(ans, f(n, i + 1, rest - kill[i]));
}
else {
ans = min(ans, f(n, i + 1, rest - kill[i] * 2));
}
swap(kill[i], kill[j]);
swap(blood[i], blood[j]);
}
return ans;
} int main() {
int inputs[] = { 3,
3, 100,
10, 20,
45, 89,
5, 40,
3, 100,
10, 20,
45, 90,
5, 40,
3, 100,
10, 20,
45, 84,
5, 40 };
int ii = 0;
int t = inputs[ii++];
for (int i = 0; i < t; i++) {
int n = inputs[ii++];
int m = inputs[ii++];
for (int j = 0; j < n; j++) {
kill[j] = inputs[ii++];
blood[j] = inputs[ii++];
}
int ans = f(n, 0, m);
if (ans == INT_MAX) {
cout << -1 << endl;
}
else {
cout << ans << endl;
}
}
return 0;
}

c完整代码如下:

#include <stdio.h>
#include <limits.h> #define MAXN 11 int kill[MAXN];
int blood[MAXN]; int min(int a, int b) {
return (a < b) ? a : b;
} void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
} int f(int n, int i, int rest) {
if (rest <= 0) {
return i;
}
if (i == n) {
return INT_MAX;
}
int ans = INT_MAX;
for (int j = i; j < n; j++) {
swap(&kill[i], &kill[j]);
swap(&blood[i], &blood[j]);
if (rest > blood[i]) {
ans = min(ans, f(n, i + 1, rest - kill[i]));
}
else {
ans = min(ans, f(n, i + 1, rest - kill[i] * 2));
}
swap(&kill[i], &kill[j]);
swap(&blood[i], &blood[j]);
}
return ans;
} int main() {
int inputs[] = { 3,
3, 100,
10, 20,
45, 89,
5, 40,
3, 100,
10, 20,
45, 90,
5, 40,
3, 100,
10, 20,
45, 84,
5, 40 };
int ii = 0;
int t = inputs[ii++];
for (int i = 0; i < t; i++) {
int n = inputs[ii++];
int m = inputs[ii++];
for (int j = 0; j < n; j++) {
kill[j] = inputs[ii++];
blood[j] = inputs[ii++];
}
int ans = f(n, 0, m);
if (ans == INT_MAX) {
printf("%d\n", -1);
}
else {
printf("%d\n", ans);
}
}
return 0;
}

2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能, 每一个技能会有一个伤害, 同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害, 每一个技能最多只能释放的更多相关文章

  1. 一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。

    一个int数组, 比如 array[],里面数据无任何限制,要求求出 所有这样的数array[i],其左边的数都小于等于它,右边的数都大于等于它.能否只用一个额外数组和少量其它空间实现. 分析:这题很 ...

  2. 嵌入式C语言自我修养 13:C语言习题测试

    13.1 总结 前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析.GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化.而通过 C 标准的 ...

  3. Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended.

    报错:Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verifica ...

  4. Spring基础13——Spring表达式语言:SpEL

    1.SpEL简介 Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言.语法上类似于EL:SpEL使用#{...}作为界定符,所有在大框号中的字符都将被认为是Sp ...

  5. c语言基础学习09_复合类型

    =============================================================================涉及到的知识点有:一.结构体1.定义结构体st ...

  6. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名 ...

  7. 编写Java程序,方法练习题__构建英雄类,定义一个int类型的变量output,表示英雄的血量

    返回本章节 返回作业目录 需求说明: 定义一个int类型的变量output,表示英雄的血量,当battle()方法执行一次,output变量值减少10.在控制台随机输入一个小于100的整数,将该整数值 ...

  8. GO语言总结(5)——类型转换和类型断言

    上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...

  9. Swift语言指南(四)--类型安全和类型推断

    原文:Swift语言指南(四)--类型安全和类型推断 Swift是一门类型安全语言,类型安全语言需要代码里值的类型非常明确.如果你的代码中有部分值需要String类型,你就不能错误地传递Int. 鉴于 ...

  10. C语言第十讲,枚举类型简单说明

    C语言第十讲,枚举类型简单说明 一丶C语言中的枚举类型(ENUM) 在我们实际工作中,或者编写代码中.我们有的时候会用固定的值.而且不是很多. 这个时候就可以使用枚举了.如果我们使用#define显然 ...

随机推荐

  1. fopen各个模式区别

    fopen 函数是C标准库中用于打开文件的函数,它接受一个文件名和一个打开模式作为参数,返回一个指向文件的指针. 这里解释各个模式的区别: "r": 以只读模式打开文件,文件必须存 ...

  2. 基于TRE文章的非线性模型化线性方法

    之前写过一篇有关TRE优化模型详解的博文: https://www.cnblogs.com/zoubilin/p/17270435.html 这篇文章里面的附录给出了非线性模型化线性的方式,具体内容如 ...

  3. .NET Core使用SkiaSharp快速生成二维码( 真正跨平台方案)

    前言 在.NET 6之前我们一直是使用QRCoder来生成二维码(QRCoder是一个非常强大的生成二维码的组件,用到了System.Drawing.Common 包),然后从.NET 6开始,当为非 ...

  4. 漏洞扫描与安全加固之Apache Axis组件

    一.Apache Axis组件高危漏洞自查及整改 Apache Axis组件存在由配置不当导致的远程代码执行风险. 1. 影响版本 Axis1 和Axis2各版本均受影响 2. 处置建议 1)禁用此服 ...

  5. CF1368B

    题目简化和分析: 因为要求长度最小,所以我们每个字符就应该发挥最大的价值,不会有没有作用的字符. 设有 \(x_1\) 个 \(c\) ,\(x_2\) 个 \(o\) ,\(x_3\) 个 \(d\ ...

  6. P8684 [蓝桥杯 2019 省 B] 灵能传输 题解

    P8684 [蓝桥杯 2019 省 B] 灵能传输 题解 Part 1 提示 题目传送门 欢迎大家指出错误并私信这个蒟蒻 欢迎大家在下方评论区写出自己的疑问(记得 @ 这个蒟蒻) Part 2 更新日 ...

  7. DevOps2023现状报告|注重文化、以用户为中心是成功的关键

    Google Cloud DORA 团队的一份新研究报告强调了企业文化和关注用户作为成功软件交付支柱的重要性. 2023 DevOps 状况报告分析了过去 9 年来通过此类最大规模调查收集的全球 36 ...

  8. java学习内容-1

    java学习内容-1 (一)jdk的使用 (二)定义标识符的规则 (三)java常用类 1.String类 2.Math类 3.Integer和Double类 4.输出 5.Scanner类 例子 ( ...

  9. 从windows到linux,图形化操作到命令行操作讲解

    作为一个后端开发人员,刚开始进入到职场中,linux还不是必备项.但是随着开发经验的提升,慢慢就会接触到linux,所以就有了那句:开发必须要会linux.一开始我也不知道linux是干嘛的,学那些命 ...

  10. 重学Java(二):对象无处不在

    前言 本系列文章内容来自于<Thinking in Java>作者的最新续作<On Java>基础卷,作者根据最新 Java 8.11.17的内容,重讲了Java的编程思想,值 ...