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. java实现 微信公众号推送消息 ,cv 就可运行!!!

    一,注册公众号 1,官网地址:申请测试公众号 地址: 微信公众平台 (qq.com) 文档地址:微信开放文档 (qq.com) 2,注册后可以查看自己的appId 和 appsecret 3,创建模板 ...

  2. LGPL协议原文及中文翻译

    LGPL协议原文及中文翻译 参考链接 原文: GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 ...

  3. Python 中多态性的示例和类的继承多态性

    单词 "多态" 意味着 "多种形式",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行. 函数多态性 一个示例是 Python ...

  4. IPv4:根据CIDR显示地址范围

    最近遇到一个很有意思的点,于是就记录下来. CIDR一般是由IP地址和子网掩码组成,即 IP地址/子网掩码 格式. 子网掩码表示前面地址中的前多少位,为网络位,后面部分代表主机部分.例如:192.16 ...

  5. VUE首屏加载优化 性能优化分析插件安装分享

    优化背景: 项目上线后 第一次进入项目要等待接近50s才能进入页面.一开始觉得是电脑配置问题或者网络问题.F12后发现加载资源过慢 其中一个chunk-***js文件有10m 加载了45s .我们使用 ...

  6. 对象转url参数

    对象转url function getParams(params) { let paramStr = ''; Object.keys(params) .forEach((item) => { i ...

  7. mysql数据库数据同步几种通用方法?

    MySQL数据库数据同步的几种通用方法包括以下几个方面: 一.基于主从同步 主从同步是 MySQL 数据库最为常见和基本的同步方式,即其中一台 MySQL 服务器作为主服务器(Master),另外一台 ...

  8. vertx的学习总结4之异步数据和事件流

    一.异步数据和事件流 1.为什么流是事件之上的一个有用的抽象? 2.什么是背压,为什么它是异步生产者和消费者的基础? 3.如何从流解析协议数据? 1.  答:因为它能够将连续的事件序列化并按照顺序进行 ...

  9. Blazor入门100天 : 自做一个支持长按事件的按钮组件

    好长时间没继续写这个系列博客了, 不知道大家还记得我吗? 话不多说,直接开撸. 1. 新建 net8 blazor 工程 b19LongPressButton 至于用什么模式大家各取所需, 我创建的是 ...

  10. 被面试官PUA了:创建索引时一定会锁表?

    索引主要是用于提高数据检索速度的一种机制,通过索引数据库可以快速定位到目标数据的位置,而不需要遍历整个数据集,它就像书籍的目录部分,有它的存在,可以大大加速查询的效率. 那么问题来了:在创建索引时一定 ...