L2-045 堆宝塔 - java

题目解析

给定n个彩虹圈,放入到A柱与B柱中,如果
彩虹圈C在A柱中与B柱中都不放入,则将A柱中的彩虹圈取下作为一件成品。求最后成品的件数,以及成品的最高的高度。

  • 如果A柱为空,或者彩虹圈C比A柱的最上面一层小,则放入A柱上;
  • 否则
    • 如果B柱为空,或者彩虹圈C比B柱的最上面一层大,则放入B柱中;
    • 否则将A柱中彩虹圈取下作为一个成品,再统计成品个数以及成品的最高高度。
      • 再依次在B柱中取下比彩虹圈C大的彩虹圈,放入到A柱中,最后把彩虹圈C也放到A柱中。

解题思路

按照题目意思模拟

可以用栈来依次判断栈顶元素是否符合条件

代码

import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{

	public static void main(String[] args)
	{
		int n = sc.nextInt();
		Stack<Integer> A = new Stack<Integer>();
		Stack<Integer> B = new Stack<Integer>();

		int cnt = 0; // 宝塔个数
		int max = 0; // 最高的宝塔层数

		for (int i = 1; i <= n; i++)
		{
			int C = sc.nextInt();

			// 能放入A柱上
			if (A.empty() || A.peek() > C)
			{
				A.push(C);
				continue;
			}

			// 能放入B柱上
			if (B.empty() || C > B.peek())
			{
				B.push(C);
				continue;
			}

			// 找到最高的宝塔层数
			max = Math.max(max, A.size());
			cnt++;
			// 清空A柱
			A.clear();

			// 将B柱上所有大于C的放入A柱上
			while (!B.empty() && C < B.peek())
			{
				A.push(B.peek());
				B.pop();
			}
			
			// 把C也放到A柱上
			A.push(C) ;
		}

		// 判断最后A柱是否还有彩虹圈
		if (!A.empty())
		{
			max = Math.max(max, A.size());
			cnt++;
		}
		// 判断最后B柱是否还有彩虹圈
		if (!B.empty())
		{
			max = Math.max(max, B.size());
			cnt++;
		}

		out.println(cnt + " " + max);

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);

}

模拟栈

import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{

	public static void main(String[] args)
	{
		int n = sc.nextInt();
		int A[] = new int[n + 10], B[] = new int[n + 10];
		int cnt1 = 0, cnt2 = 0;

		int cnt = 0; // 宝塔个数
		int max = 0; // 最高的宝塔层数

		for (int i = 1; i <= n; i++)
		{
			int C = sc.nextInt();

			// 能放入A柱上
			if (cnt1 == 0 || A[cnt1] > C)
			{
				A[++cnt1] = C;
				continue;
			}

			// 能放入B柱上
			if (cnt2 == 0 || C > B[cnt2])
			{
				B[++cnt2] = C;
				continue;
			}

			// 找到最高的宝塔层数
			max = Math.max(max, cnt1);
			cnt++;
			// 清空A柱
			cnt1 = 0;

			// 将B柱上所有大于C的放入A柱上
			while (cnt2 != 0 && C < B[cnt2])
				A[++cnt1] = B[cnt2--];

			// 把C也放到A柱上
			A[++cnt1] = C;
		}

		// 判断最后A柱是否还有彩虹圈
		if (cnt1 != 0)
		{
			max = Math.max(max, cnt1);
			cnt++;
		}
		// 判断最后B柱是否还有彩虹圈
		if (cnt2 != 0)
		{
			max = Math.max(max, cnt2);
			cnt++;
		}

		out.println(cnt + " " + max);

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);

}

Stack
Stack


团体程序设计天梯赛-练习集-java

赞赏