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

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

时间:2024-01-13 16:01:39浏览次数:36  
标签:inputs 游戏 int rest ii kill ans 伤害 技能

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
}

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

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
    }
}

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

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;
}

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

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个技能, 每一个技能会有一个伤害, 同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害, 每一个技能最多只能释放_#include_04

标签:inputs,游戏,int,rest,ii,kill,ans,伤害,技能
From: https://blog.51cto.com/moonfdd/9232609

相关文章

  • 2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能, 每一个技能
    2024-01-13:用go语言,现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能,每一个技能会有一个伤害,同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害,每一个技能最多只能释放一次,已知怪物有m点血量。现在想问你最少用几个技能能消灭掉他(血量小于等于0)。技能的数量是n,怪......
  • 案例分享:游戏行业各岗位的KPI绩效指标制定
    在游戏行业中,岗位种类繁多,每个岗位的职责和要求都有所不同。因此,制定合理的KPI(关键绩效指标)是确保团队高效运作的关键。在竞争激烈的市场环境中,合理的KPI不仅有助于员工明确工作方向,还能促进团队的高效协作。本文将深入探讨游戏行业中策划、美术、程序、运营、测试、市场营销和客......
  • 武汉灰京文化:休闲类游戏在推广中的新趋势,利用新媒体平台迎合上班族用户需求
    随着社会节奏的加快和工作压力的增大,越来越多的上班族开始追求休闲娱乐的方式来放松身心。休闲类游戏因其简单易玩、随时随地都能进行的特点,成为了推广的热门选择。在这个过程中,目标用户的定位也成为了关键,而主要集中在工作繁忙、时间有限的上班族。为了满足这一群体的需求,推广策略......
  • 游戏被攻击,有没有什么好的解决办法
    游戏行业是DDoS攻击的主要目标了。每当遭受攻击,都会带来游戏不可用,经常会遭受到勒索损失或营收日直接损失,高者损至千万。最关键的是在活动、新游戏发布以及节假日游戏高峰时间段,如若遭受DDoS攻击,那么游戏公司损失更加明显,并且还会直接影响到玩家的游戏体验,造成用户流失,直接缩短游戏......
  • 武汉星河互娱:全方位推广战略引领游戏市场风向
    在激烈竞争的游戏市场中,武汉星河互娱网络科技有限公司凭借其广泛的渠道资源和紧密的行业合作关系成功打造了一套全方位的推广策略,将游戏推广覆盖到更多的用户群体中。公司通过与各大平台的战略合作,以及社交媒体、直播平台等多元化的推广手段,不仅将游戏呈现在用户眼前,还扩大了游戏的......
  • 武汉星河互娱:多渠道合作引领游戏市场创新浪潮
    随着游戏市场的不断发展,武汉星河互娱网络科技有限公司凭借其广泛的渠道资源和战略合作,成功打造了一种全新的游戏推广和体验模式。这家公司不仅为游戏市场注入了新的推广思路,更是通过创新努力,成功打造了一个多元化、全方位的游戏体验平台,为整个行业带来了新的活力。多渠道合作成为武......
  • 游戏行业掀起新风潮,武汉星河互娱游戏联运助力企业合作共赢
    近年来,游戏行业掀起一股新的潮流——游戏联运。这一合作模式不仅帮助游戏公司迅速扩大用户规模,提升游戏知名度和影响力,同时也为企业之间搭建了合作共赢的桥梁,助力行业持续繁荣发展。游戏联运,是指游戏公司与其他平台或企业进行合作,通过联合运营的方式来推广游戏,并分享相应的收益。这......
  • 武汉星河互娱:多渠道战略合作引领游戏市场新潮流
    随着科技的不断发展,游戏产业成为引领潮流的风向标,而武汉星河互娱网络科技有限公司凭借其广泛的渠道资源和创新的推广策略,成功打破了传统游戏推广的束缚,成为游戏市场的领导力量。武汉星河互娱的成功不仅体现在游戏的知名度提升上,更表现在其与各大平台展开的战略合作。通过多渠道的合......
  • Unity3D 如何把全部游戏逻辑都放到lua层实现详解
    Unity3D是一款非常流行的游戏开发引擎,它支持C#、JavaScript和Boo等脚本语言。然而,有时候我们可能希望将全部游戏逻辑都放到Lua层实现,这样可以更方便地进行游戏逻辑的修改和调试。本文将详细介绍如何使用Unity3D将全部游戏逻辑都放到Lua层实现。对啦!这里有个游戏开发交流小组里面......
  • 2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题
    2023年山东省职业院校技能大赛高职组信息安全管理与评估理论题理论技能与职业素养(100分)2023年山东省职业院校技能大赛高职组信息安全管理与评估理论题【注意事项】Geek极安云科专注技能竞赛技术提升,基于各大赛项提供全面的系统性培训,拥有完整的培训体系。团队拥有曾获国奖......