当前位置: 首页 > biancheng >正文

打怪升级(考验思路)

  某同学最近迷上打怪升级的小游戏,该总共有n个关卡,每个关卡需要消耗的能量值为Wi​,每个关下能获得Wj​的能量。但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?(游戏过程中允许出现负数情况)

输入格式:

第一行输入关下数n
第二行输入1~n个关下的消耗能量
第三行输入1~n个关下的获得能量

输出格式:

输出一个整数,表示获得能量的最大值


输入样例:

10
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

输出样例:

25

题意分析

这一题其实是蛮有意思的 ,首先对题目的理解,就是你在一个游戏的闯关过程中,你有消耗值和得到值,如果你的消耗值小于得到值,那么你的积累值(经验)就越大,反之越小,你自然是想要你的积累数值越大 錒,然后还有一个要求就是是连续的,你所需要的是连续的关卡数,然后在这个的情况下去获得最大的数值。我想你大致是明白这个题目的要求了。

但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?

做题的步骤分析:

  • 首先输入一个数值n,n代表你游戏的关卡数目
  • 既然是要求你有开始的关卡数,那么你势必在每个关卡中会有对应的消耗值和获得值
  • 那么定义俩数组怎么样,第一个数组来存放消耗值,第二个数组来存放收获值
  • 那么这就结束了吗? 显然没有,我是不是要去存放俩数组的差值,第二个数组减去第一个数组。如果数为正,那么说明我的经验值是在增加,反之是在减少,然后我在在这个数组里来去求我的前n项的正数和,确保我得到的数值是最大
  • 那么就有疑问了,想法是很好,那么怎么实现呢?

如下:

我可以去定义三个数组,arr1{N},arr2[N]是在main中,但是arr3【N】是在全局数组中,

然后对第一个消耗值的输入,同理对第二行得到值的输入,反正是俩,为何不定义两次呢

while (i<n) {
        scanf("%d", &arr1[i]);
        i++;
    }

当你精确到数组的某个地址时,其实能代表其所涵盖的数值

for (i = 0; i < n; i++) {
        arr3[i] = arr2[i] - arr1[i];// 将俩个的差值存在第三个数组中
    }
    

然后我开始调用函数,这个函数就是得到这个数组中连续数的前n项的最大数值并可以打印

sum = MaxSum(arr3, n);
    printf("%d", sum); 

函数的分析,我贼喜欢这个函数了(建议收藏)

第一步是判断你传入的数组时不是空,空的条件是俩(有一个就是空),当你传入的数组元素为NULL是或者这个数组的长度就是 0 足够说明这个数组就是空

if (a == NULL || size == 0)    //houxa
    
        return -1;
    }

核心部分哈

开始的时候,我在for循环中我不需要去有初始值,我直接不要了,但是我是要求我的具有这个长度的,因为我要靠这些长度来进行比较,然后我的sum值就是在加了一个数组的第一个arr[0],进行比较,如果我的添加后的元素小于原来的元素,那么我明显是很吃亏的嘛,我自然不能继续添加了,所以我的sum值就舍弃之前的元素,从现在开始叠加,但是如果我大于呢,我就赋值给max,这个就是那个比较数的大小一样的原理,最后肯定是是得到较大的额数值的。

 for (; index < size; ++index)
    {
        sum = sum + a[index];//遍历一个元素,累加一次
        if (sum < a[index])//如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
        {
            sum = a[index];
        }
        if (sum > max)
        {
            max = sum;
        }
    }

 这是全部的代码,可编译。

#include <stdio.h>
#define  N 1000
int MaxSum(int a[], int size);
int arr3[N];
int main(void)
{
	int n,t;
	int i=0, j=0,sum;
	int arr1[N], arr2[N];
	scanf("%d", &n);
	while (i<n) {
		scanf("%d", &arr1[i]);
		i++;
	}
	while (j < n) {
		scanf("%d", &arr2[j]);
		j++;
	}
	for (i = 0; i < n; i++) {
		arr3[i] = arr2[i] - arr1[i];
	}
	
	sum = MaxSum(arr3, n);
	printf("%d", sum);
	return 0;
}
int MaxSum(int a[], int size)
{
    if (a == NULL || size == 0)
    {
        return -1;
    }
    int sum = 0;//初始和为0
    int index = 0;
    int max = a[index];//最大值最初必为数组第一个元素
    for (; index < size; ++index)
    {
        sum = sum + a[index];//遍历一个元素,累加一次
        if (sum < a[index])//如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
        {
            sum = a[index];
        }
        if (sum > max)
        {
            max = sum;
        }
    }
    return max;
}

相关文章:

  • 打怪升级(考验思路)
  • 持续精进,改变自己
  • 微信支付服务商,可视化进件特约商户
  • AcWing第 77 场周赛
  • 开发一个app,需要申请哪些,费用是多少?
  • 计算机操作系统笔记总结
  • 少儿编程--枚举算法
  • 记一次使用动态引入vue组件的经历
  • 离散数学---判断矩阵:自反性,反自反性,对称性得到矩阵的自反闭包,对称闭包。
  • 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)