集合框架题:PIPI的乐高积木

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。集合框架题:PIPI的乐高积木,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

集合框架题:PIPI的乐高积木

问题:

在这里插入图片描述
在这里插入图片描述

思路:

在这里插入图片描述
首先,为了保证最高柱子与最矮柱子的高度差越来越小,每次移动都需要将最高柱子上的一个块移动到最矮柱子上,即最矮柱子高度 + 1,最高柱子高度 – 1。我们需要一种数据结构能使其中的元素一直保持按序排列,红黑树即是我们需要的数据结构,Java中TreeSet即是用红黑树实现的,能满足上述要求。

对于高度的变化,我们只需删除原来最高柱与最矮柱,然后添加两个新柱子即可,高度分别为最矮柱子高度 + 1,最高柱子高度 – 1

由于最后需要输出每次移动的两个柱子的编号,我们还需将编号和高度一同存入TreeSet。每次移动的柱子的编号存入二维数组中即可。

需注意的点

  • 当最高柱高度 – 最矮柱高度 <= 1时,此时已无法再减少两者之差,因此终止移动
  • 当高度相同时,我们需选取编号最大的高柱和编号最小的矮柱。创建类保存编号和高度,该类需实现Comparable接口,重写compareTo方法自定义排序规则

代码:

import java.util.Scanner;
import java.util.TreeSet;

public class Main {
    static TreeSet<HeightAndNum> treeSet = new TreeSet<>();
    public static void main(String[] args) {
        int move[][] = new int[5005][2];
        int minBeauty;
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int k = scanner.nextInt();
        int i;
        for (i = 0;i < N;i++) {
            treeSet.add(new HeightAndNum(scanner.nextInt(), i + 1));
        }
        i = 0;
        while (i < k) {
            if (treeSet.last().height - treeSet.first().height <= 1) {
                break;
            }
            int minNum = treeSet.first().num;
            int maxNum = treeSet.last().num;
            int minPoll = treeSet.pollFirst().height;
            int maxPoll = treeSet.pollLast().height;
            treeSet.add(new HeightAndNum(minPoll + 1, minNum));
            treeSet.add(new HeightAndNum(maxPoll - 1,maxNum));
            move[i][0] = maxNum;
            move[i][1] = minNum;
            i++;
        }
        minBeauty = treeSet.last().height - treeSet.first().height;
        System.out.print(minBeauty + " " + i);
        System.out.print('\n');
        for (int j = 0;j < i;j++) {
            System.out.println(move[j][0] + " " + move[j][1]);
        }
    }

    static class HeightAndNum implements Comparable{
        int height;
        int num;
        public HeightAndNum(int height, int num) {
            this.height = height;
            this.num = num;
        }

        @Override
        public int compareTo(Object o) {
            HeightAndNum other = (HeightAndNum) o;
            if (this.height > other.height) {
                return 1;
            } else if (this.height == other.height) {
                return this.num - other.num;
            }
            return -1;
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153760.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!