`
lylegend13
  • 浏览: 84061 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

未通过的1011——堆栈方式

阅读更多

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class Main {
	public static void main(String[] args) {
		new Main();
	}

	public Main() {
		Scanner s = new Scanner(System.in);
		while (s.hasNextInt()) {
			// 获得长度
			int count = s.nextInt();
			if (count == 0) {
				break;
			}

			int[] nums = new int[count];

			// 获得数组、和
			int sum = 0;
			for (int i = 0; i < count; i++) {
				int num = s.nextInt();
				sum += num;
				nums[i] = num;
			}
			// 排序
			Arrays.sort(nums);

			// 最大值
			int max = nums[count - 1];

			// 遍历可能的结果
			for (int i : getList(sum)) {
				if (max <= i) {
					if (exec(nums, i, sum)) {
						break;
					}
				}
			}

		}

		s.close();

	}

	public boolean exec(int[] nums, int l, int sum) {
		// 数组长度
		int size = nums.length;
		// 可变总长
		int s = l;
		// 堆栈
		Stack<Integer> stack = new Stack<Integer>();
		// 标记
		boolean[] flags = new boolean[size];
		// 初始化i
		int i = size - 1;

		while (true) {

			for (; i >= 0; i--) {
				// 如果剩余可用数之和不够,pass
				if (!isEnough(nums, flags, i, s)) {
					break;
				}
				// 如果当前数不可用,pass
				if (flags[i]) {
					continue;
				}
				int n = nums[i];
				// 如果大于和,pass
				if (n > s) {
					continue;
				}
				// 如果跟上一个可用数一样,pass
				if (i + 1 < size && n == nums[i + 1] && !flags[i + 1]) {
					continue;
				}
				// 标记已用
				flags[i] = true;
				// 进栈
				stack.push(i);
				// 从和中减掉
				s -= n;
				if (s == 0) {
					sum -= l;
					// 判断是否全部用尽
					if (sum == 0) {
						System.out.println(l);
						return true;
					} else {
						// 再次轮回匹配剩余的可用数
						i = size - 1;
						s = l;
					}
				}
			}
			// 可用数用尽,当前匹配也没成功
			// 恢复最后的数
			int top = stack.pop();
			flags[top] = false;
			s += nums[top];
			if (s == l) {
				sum += l;
				if (!stack.isEmpty()) {
					top = stack.pop();
					flags[top] = false;
					s = nums[top];
				}
			}
			// 如果是边缘,恢复倒数第二个数
			if (top == 0) {
				top = stack.pop();
				flags[top] = false;
				s += nums[top];
			}
			// 如果弹出的数是栈中最后一个,匹配失败
			if (top == size - 1) {
				return false;
			}
			// 从下一个可用数开始
			i = top - 1;
		}
	}

	// 判断剩余可用数之和是否够
	public boolean isEnough(int[] nums, boolean[] flags, int begin, int sum) {
		for (int i = begin; i >= 0; i--) {
			if (!flags[i]) {
				sum -= nums[i];
				if (sum <= 0) {
					return true;
				}
			}
		}
		return false;
	}

	// 获得可能的结果List
	public List<Integer> getList(int n) {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 1; i <= Math.sqrt(n); i++) {
			if (n % i == 0) {
				list.add(i);
				if (i * i != n) {
					list.add(n / i);
				}
			}
		}
		Collections.sort(list);
		return list;
	}
}
 
分享到:
评论

相关推荐

    ARM寻址方式——堆栈寻址

    "ARM寻址方式——堆栈寻址" ARM处理器中的堆栈寻址是一种重要的寻址方式,用于实现数据的存储和读取。在本文中,我们将详细介绍ARM寻址方式中的堆栈寻址,包括堆栈的概念、堆栈的增长方式、堆栈指针和堆栈的访问...

    数据结构——堆栈和队列

    总的来说,这个压缩包提供了关于数据结构——堆栈和队列的C语言实现,以及额外的数字转换和字符串处理功能。这些基础知识对于理解和编写高效的计算机程序至关重要。通过学习和理解这些内容,开发者能够更好地解决...

    全国青少年信息学奥林匹克联赛数据结构——堆栈和队列

    例如,处理表达式时,可以将运算符视为操作,运算数视为数据,通过堆栈实现中缀表达式转后缀表达式,简化计算逻辑。 **存储结构**: 堆栈的常见存储方式是使用一维数组。数组的一个端点(通常是末尾)作为栈顶,另...

    堆栈——用类的方法实现C++

    在这个“堆栈——用类的方法实现C++”的主题中,我们将深入探讨如何在C++编程语言中使用类来实现堆栈的数据结构。 首先,让我们定义堆栈的基本操作。堆栈有两个主要的操作:压入(push)和弹出(pop)。压入操作是...

    eCos组件——中断堆栈信息获取支持

    该eCos组件提供中断堆栈信息的获取,包括堆栈基址、分配空间大小、已使用大小,主要用于中断堆栈溢出的风险评估,依据堆栈的使用情况对堆栈空间分配进行调整。 组件安装和使用请阅读...

    ARM指令的寻址方式-堆栈寻址.pdf

    在ARM处理器中,通常使用一个专门的寄存器——堆栈指针(SP,Stack Pointer)来指示当前堆栈操作的位置。堆栈指针可以向上或向下移动,根据堆栈的生成方向,堆栈可以分为递增堆栈和递减堆栈两种基本类型。 1. 递增...

    课堂练习——寻址方式1

    3. 变址寻址:这种寻址方式通过一个基值寄存器加上一个偏移量来确定操作数的地址。8086的16位变址寄存器同样为BX、BP、SI和DI。例如,`MOV AX, [CX + 50H]`。但是,根据题目,如`MOV AX, 2[CX]`是错误的,因为16位...

    堆栈的说明

    标题中的“堆栈的说明”意味着我们将探讨计算机科学中数据结构的一种——堆栈。堆栈是一种后进先出(LIFO, Last In First Out)的数据结构,它在处理递归、函数调用、内存管理等问题时起着至关重要的作用。 堆栈的...

    一种支持SIMD体系结构的高效分布式堆栈——HEDSSA.pdf

    为了解决这一问题,文中提出了高效分布式堆栈设计方法——HEDSSA(High Efficient Distributed Stack for SIMD Architecture)。HEDSSA的设计充分考虑了SIMD体系结构的特点,并通过分布式设计提高了对局部数据的访问...

    数据结构之C++四则运算(自己写的堆栈)

    在这个项目中,C++被用来实现数据结构——堆栈,并利用堆栈处理四则运算。 堆栈是一种后进先出(LIFO)的数据结构,常用于执行回溯、表达式求值和递归等任务。在四则运算中,堆栈可以用于计算中缀表达式(例如,2 +...

    骑士遍历堆栈国际象棋C++

    【骑士遍历堆栈国际象棋C++】是一种在编程领域中常见的算法问题,它结合了国际象棋的规则和计算机科学中的数据结构——堆栈,来解决在n*n棋盘上实现骑士的不重复遍历。在此问题中,骑士遵循其在国际象棋中的移动规则...

    用堆栈实现汉诺塔演示的窗口应用程序及其C#源代码

    在这个问题中,我们使用了计算机科学中的数据结构——堆栈来解决这个问题。堆栈是一种后进先出(LIFO)的数据结构,非常适合处理此类递归问题。 在C#编程语言中,我们可以创建一个类或结构体来表示盘子,并用一个...

    C#编写的贪食蛇堆栈技术

    在C#编程语言中实现贪食蛇,不仅可以帮助初学者掌握基本的编程技巧,还能深入理解数据结构中的一个重要概念——堆栈。本文将详细探讨如何运用C#和堆栈技术来实现贪食蛇游戏。 首先,我们需要理解什么是堆栈。在...

    ——————PC——————(2)

    具体而言,首先保留第一个数据不变,之后的数据通过计算它与前一个数据的差值,并使用四位二进制补码来表示这个差值。两个这样的差值组合成一个字节,其中前一个差值位于高四位,后一个差值位于低四位。 #### 实现...

    基本数据结构(3)堆栈

    本文将深入探讨“基本数据结构(3)——堆栈”,重点关注C++中实现的顺序存储堆栈(contstack)和链式存储堆栈(linkstack)。 堆栈是一种后进先出(LIFO,Last In First Out)的数据结构,其操作类似于日常生活中...

    C++堆栈自由存储区全局静态存储区和常量存储区 C++堆栈自由存储区全局静态存储区和常量存储区

    根据给定的信息,本文将对C++中的四种存储区域——堆栈、自由存储区、全局静态存储区以及常量存储区进行详细的解析。 ### 一、堆栈(Stack) 堆栈是程序运行时的一种重要的存储区域,它由操作系统管理,并且在函数...

    数据结构课程堆栈知识应用

    根据提供的代码示例,我们可以看到一个典型的堆栈应用场景——**表达式求值**。 1. **中缀转后缀**(`ConvertToPost`): 将输入的中缀表达式转换成后缀表达式。 2. **逆置堆栈**(`Reverse`): 对转换后的表达式进行...

    存储器、堆栈、SFR数据存储器——RAM(RandomAccessMemory).ppt

    存储器、堆栈、SFR数据存储器——RAM(Random Access Memory) 在计算机系统中,存储器是非常重要的一部分,它是计算机系统中存储程序和数据的设备。存储器可以分为两大类:RAM(Random Access Memory)和ROM(Read...

    (数据结构实验)计算器--堆栈实现

    本实验的主题是“(数据结构实验)计算器--堆栈实现”,这涉及到计算机科学中的一个重要概念——堆栈。堆栈是一种线性数据结构,遵循后进先出(LIFO)的原则,也就是最后进入的元素最先被移出。在这个实验中,我们将...

    P的易语言模块-带堆栈的模块源码.rar

    《易语言模块源码解析——探索带堆栈的模块实现》 易语言,作为一款以中文编程为特色的编程环境,以其简洁明了的语法和强大的功能深受初学者喜爱。本资料包“P的易语言模块-带堆栈的模块源码.rar”提供了适合初学者...

Global site tag (gtag.js) - Google Analytics