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. javascript 如何开启调试功能

    目录 javascript 如何开启调试功能 方式一: 打开浏览器,点击源码,直接点击一个,就加上断点了 (基于浏览器) 方式二: 打开代码,在 js 中加入 debugger 关键字,就加上断点了( ...

  2. Ubuntu18.04环境下安装redis 6.2.0,配置文件的部分参数说明

    环境是win11的Linux子系统Ubuntu-18.04,安装方式是源码安装,也可以用apt安装(见本文最后参考资料),用的用户是默认用户(所以一些关键命令要注意用sudo,不用会报错) 安装: j ...

  3. 运用chatGPT生成E-R图的prompt

    根据以上内容,让我们定义用例 让我们为用例定义一个数据模型 更详细地描述数据模型或使用 Markdown 的表格格式 这种模型可以根据具体的用例进行扩展和修改,以满足需求分析和设计过程中的实际需要. ...

  4. PXE批量网络装机

    PXE高效批量网络装机 系统装机的三种引导方式 1.硬盘 2.光驱(u盘) 3.网络启动 pxe 系统安装过程 加载boot loader Boot Loader 是在操作系统内核运行之前运行的一段小 ...

  5. HarmonyOS UI 开发

    引言 HarmonyOS 提供了强大的 UI 开发工具和组件,使开发者能够创建吸引人的用户界面.本章将详细介绍在 HarmonyOS 中应用 JS.CSS.HTML,HarmonyOS 的 UI 组件 ...

  6. 【实践篇】一次Paas化热部署实践分享

    前言 本文是早些年,Paas化刚刚提出不久时,基于部门内第一次Paas化热部署落地经验所写,主要内容是如何构建一些热部署代码以及一些避雷经验. 一.设计-领域模型设计 1.首先,确定领域服务所属的领域 ...

  7. NewsCenter

    打开界面有一个搜索框 抓包查看是post形式提交的数据包 这时候试试sql注入,万能密码直接全都显示,那就说明存在sql注入漏洞 这里试试用sqlmap自动注入试试(POST类型的sql注入第一次尝试 ...

  8. 中龙技术 | HSCSEC CRY + MISC WP

    CRYPTO[HSC-1th] Easy SignIn 5445705857464579517A4A48546A4A455231645457464243566B5579556C7053546C4A4E ...

  9. 将ECharts图表插入到Word文档中

    @ 目录 在后端调用JS代码 准备ECharts库 生成Word文档 项目地址 库封装 本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图 ...

  10. (Good topic)压缩字符串 (3.16 leetcode每日打卡)

    字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返回原先的字符 ...