2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能, 每一个技能会有一个伤害, 同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害, 每一个技能最多只能释放
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:
来自左程云。
大体过程如下:
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个技能, 每一个技能会有一个伤害, 同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害, 每一个技能最多只能释放的更多相关文章
- 一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
一个int数组, 比如 array[],里面数据无任何限制,要求求出 所有这样的数array[i],其左边的数都小于等于它,右边的数都大于等于它.能否只用一个额外数组和少量其它空间实现. 分析:这题很 ...
- 嵌入式C语言自我修养 13:C语言习题测试
13.1 总结 前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析.GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化.而通过 C 标准的 ...
- 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 ...
- Spring基础13——Spring表达式语言:SpEL
1.SpEL简介 Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言.语法上类似于EL:SpEL使用#{...}作为界定符,所有在大框号中的字符都将被认为是Sp ...
- c语言基础学习09_复合类型
=============================================================================涉及到的知识点有:一.结构体1.定义结构体st ...
- [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题
go语言圣经-声明1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名 ...
- 编写Java程序,方法练习题__构建英雄类,定义一个int类型的变量output,表示英雄的血量
返回本章节 返回作业目录 需求说明: 定义一个int类型的变量output,表示英雄的血量,当battle()方法执行一次,output变量值减少10.在控制台随机输入一个小于100的整数,将该整数值 ...
- GO语言总结(5)——类型转换和类型断言
上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...
- Swift语言指南(四)--类型安全和类型推断
原文:Swift语言指南(四)--类型安全和类型推断 Swift是一门类型安全语言,类型安全语言需要代码里值的类型非常明确.如果你的代码中有部分值需要String类型,你就不能错误地传递Int. 鉴于 ...
- C语言第十讲,枚举类型简单说明
C语言第十讲,枚举类型简单说明 一丶C语言中的枚举类型(ENUM) 在我们实际工作中,或者编写代码中.我们有的时候会用固定的值.而且不是很多. 这个时候就可以使用枚举了.如果我们使用#define显然 ...
随机推荐
- Python socket实现简单聊天,同步输入和接收消息
查的资料很多都是必须等待接收数据后才能再次输入.做了修改,使用多线程的形式,实现一边输入,一边接收 服务端代码 import socket import threading import sys im ...
- 11G手动建库
◆◆◆11G手动建库◆设置环境变量export ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=/u01/app/oracle/product/11.2.4 ...
- C#学习笔记---异常捕获和变量
异常捕获 使用异常捕获可以捕获出现异常的代码块,防止因为异常抛出造成的程序卡死的情况发生. try{}catch{}finally{}结构 //异常捕获 try { string str=Consol ...
- 当个 PM 式程序员「GitHub 热点速览」
本周 GitHub 热点依旧是 GPT 类项目,当中的佼佼者自然是本文收录的 gpt-pilot,一周获得了 7k+ star.此外,像是 LangChain.Autogen 之类的 LLM 工具链项 ...
- 轻松掌握组件启动之MongoDB(上):高可用复制集架构环境搭建
MongoDB复制集 复制集架构 在生产环境中,强烈不建议使用单机版的MongoDB服务器.原因如下: 单机版的MongoDB无法保证系统的可靠性.一旦进程发生故障或是服务器宕机,业务将直接不可用.此 ...
- 基于GPS定位和人脸识别的作业识别管理系统
一.技术参数 mysql5.5 asp.net jquery 高德地图api 百度人脸识别api 二.功能简介 实现简单的施工项目管理,包括项目地点,工期,名称,编号等 实现作业人员的档案信息管理,包 ...
- Xmind思维导图工具2023最新专业版破解思路
工具介绍 XMind 是一款最为流行的专业级思维_导图_制作与编辑软件,它现在在全球范围内都已极具名气,可谓是办公.学习.团队交流必备工具之一. 准备工作 1,官方Xmind软件 2,一个心意的编辑器 ...
- Flask解决跨域问题
什么是跨域问题 跨域问题指的是浏览器限制了从一个源(协议.域名.端口)访问另一个源的资源的行为,这个限制是浏览器的一个安全机制.如果一个网页从一个源加载了另一种类型的资源(例如 HTML.CSS.脚本 ...
- Grafana新手教程-实现仪表盘创建和告警推送
前言 最近在使用Grafana的时候,发现Grafana功能比想象中要强大,除了配合Prometheus使用之外,他自身都可以做很多事情,可视化和监控平台,还可以直接根据用户自定义的告警规则完成告警和 ...
- SPI扩展点在业务中的使用及原理分析
1 什么是SPI SPI 全称Service Provider Interface.面向接口编程中,我们会根据不同的业务抽象出不同的接口,然后根据不同的业务实现建立不同规则的类,因此一个接口会实现多个 ...