荒岛逃生游戏

题目描述

一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。

假定每个人移动的速度一样,且只可选择向左或向右逃生。

若两个人相遇,则进行决斗,战斗力强的能够活下来,并损失掉与对方相同的战斗力;若战斗力相同,则两人同归于尽。

输入描述

给定一行非 0 整数数组,元素个数不超过30000;

正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。

输出描述

能够逃生的人总数,没有人逃生输出0,输入异常时输出-1。

示例1

输入

5 10 8 -8 -5

输出

2

说明

第3个人和第4个人同归于尽,第2个人杀死第5个人并剩余5战斗力,第1个人没有遇到敌人。

解题思路

从头开始逐个读取 向右移动的数,遇到向左移动的数,后读取的数需要先和向左移动的数进行战斗,战斗人员是一个先进后出的顺序,考虑使用栈这个结构进行处理

源码 Java

java 复制代码
public class EscapeIsland {

	static Input input ;
	static {
		input = new Input("5 10 8 -8 -5");
	}

	public static void main(String[] args) {
		Stack<Integer> right = new Stack<>();
		Stack<Integer> left = new Stack<>();
		String[] split = input.nextLine().split(" ");
		for (int i = 0; i < split.length; i++) {
			int val = Integer.parseInt(split[i]) ;
			if (val == 0) {
				System.out.println(-1);
				return;
			}
			if (val > 0) {
				right.push(val);
			} else {

				int power = val;

				while (!right.isEmpty() && power < 0) {
					int r = right.pop();
					power += r;
				}
				if (power > 0) {
					right.push(power);
				} else if(power < 0) {
					left.push(power);
				}
			}
		}
		System.out.println(right.size() + left.size());
	}

}
相关推荐
故事和你918 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__8 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__9 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
_日拱一卒10 小时前
LeetCode:2两数相加
算法·leetcode·职场和发展
py有趣10 小时前
力扣热门100题之零钱兑换
算法·leetcode
董董灿是个攻城狮10 小时前
Opus 4.7 来了,我并不建议你升级
算法
无敌昊哥战神10 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode
脱氧核糖核酸__10 小时前
LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
数据结构·c++·算法·leetcode