Sorting_Searching 叠罗汉 @CareerCup

CI 9.7-叠罗汉 给定N个人的身高和体重,然后叠罗汉。规则是:每个人踩在另一个人的肩膀上,上面人的身高和体重都要低于下面的人。实现一个方法计算N个人最多可以叠多少人。 例子: 输入(height, weight):(65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110) 输出:6 (从上到下是:(56, 90) (60,95) (65,100) ( 阅读详情

类似前面的一道堆箱子

普适的解法是回溯,注意这类是求最值的回溯题。

另一种解法是LIS,先把其中一维排序,然后对剩下的一维进行LIS


package Sorting_Searching;

import java.util.ArrayList;
import java.util.Collections;


/**
 * A circus is designing a tower routine consisting of people standing atop one another’s shoulders. For practical and aesthetic reasons, each person must be both shorter and lighter than the person below him or her. Given the heights and weights of each person in the circus, write a method to compute the largest possible number of people in such a tower.

EXAMPLE:

Input (ht, wt): (65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110)

Output: The longest tower is length 6 and includes from top to bottom: (56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)

译文:

马戏团设计了这样一个节目:叠罗汉。一群人往上叠,每个人都踩在另一个人的肩膀上。 要求上面的人要比下面的人矮而且比下面的人轻。给出每个人的身高和体重, 写一个函数计算叠罗汉节目中最多可以叠多少人?

例子:

输入(身高 体重):(65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110)

输出:最多可叠人数:6 (从上到下是:(56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)) 
 *
 */
public class S11_7 {

	public static void main(String[] args) {
		ArrayList<HtWt> items = initialize();
		System.out.println(solve(items));
		ArrayList<HtWt> solution = getIncreasingSequence(items);
		printList(solution);
	}
	
	public static int solve(ArrayList<HtWt> items){
		boolean[] used = new boolean[items.size()];
		HtWt bottom = null;
		ArrayList<HtWt> ret = new ArrayList<HtWt>();
		int maxPeople = rec(items, used, bottom, ret);
		System.out.println(ret);
		return maxPeople-1;		// -1是因为第一个dummy element,我设置成null
	}
	
	public static int rec(ArrayList<HtWt> items, boolean[] used, HtWt cur, ArrayList<HtWt> curAL){
		
		boolean flag = false;			// 判断是否找到了一个选择
		int maxAbovePeople = 0;		// 基于当前的所有选择,找到最优子结构
		
		for(int i=0; i<items.size(); i++){
			if(!used[i]){
				used[i] = true;
				HtWt next = items.get(i);
				if(next.isBefore(cur)){
					flag = true;
					ArrayList<HtWt> nextAL = new ArrayList<HtWt>();		// 为子调用新建的AL
					int abovePeople = rec(items, used, next, nextAL);
					if(abovePeople > maxAbovePeople){
						curAL.clear();					// 必须先清除
						curAL.addAll(nextAL);		// 现在子序列中的就是能使得人数最多的选择
						maxAbovePeople = abovePeople;
					}
				}
				used[i] = false;
			}
		}
		
		
		if(flag == false){
			curAL.clear();
			curAL.add(cur);
			return 1;
		}
		
		curAL.add(cur);
		return maxAbovePeople+1;
	}
	
	public static ArrayList<HtWt> initialize() {
        ArrayList<HtWt> items = new ArrayList<HtWt>();
        
        HtWt item = new HtWt(70, 150);
        items.add(item);
        
        item = new HtWt(68, 110);
        items.add(item);

        item = new HtWt(56, 90);
        items.add(item);
        
        item = new HtWt(75, 190);
        items.add(item);
        
        item = new HtWt(60, 95);
        items.add(item);
        
        
        item = new HtWt(35, 65);
        items.add(item);
        
        item = new HtWt(40, 60);
        items.add(item);
        
        item = new HtWt(45, 63);
        items.add(item);
        
        return items;

	}
	
	public static void printList(ArrayList<HtWt> list) {
        for (HtWt item : list) {
                System.out.println(item.toString() + " ");
        }
	}

	static class HtWt implements Comparable {
		private int Ht;
		private int Wt;

		public HtWt(int h, int w) {
			Ht = h;
			Wt = w;
		}

		public int compareTo(Object s) {
			HtWt second = (HtWt) s;
			if (this.Ht != second.Ht) {
				return ((Integer) this.Ht).compareTo(second.Ht);
			} else {
				return ((Integer) this.Wt).compareTo(second.Wt);
			}
		}

		public String toString() {
			return "(" + Ht + ", " + Wt + ")";
		}

		/*
		 * Returns true if “this” should be lined up before “other”. Note that
		 * it’s possible that this.isBefore(other) and other.isBefore(this) are
		 * both false. This is different from the compareTo method, where if a <
		 * b then b > a.
		 */
		public boolean isBefore(HtWt other) {
			if(other == null){
				return true;
			}
			if (this.Ht < other.Ht && this.Wt < other.Wt) {
				return true;
			} else {
				return false;
			}
		}
	}
	
	//=========================== 另一种方法是用LIS来做
	private static ArrayList<HtWt> longestIncreasingSubsequence(ArrayList<HtWt> array) {
        ArrayList<HtWt>[] solutions = new ArrayList[array.size()];
        longestIncreasingSubsequence(array, solutions, 0);
        
        ArrayList<HtWt> best_sequence = null;
        for (int i = 0; i < array.size(); i++) {
        	best_sequence = seqWithMaxLength(best_sequence, solutions[i]);
        }
        
        return best_sequence;
	}
	
	private static void longestIncreasingSubsequence(ArrayList<HtWt> array, ArrayList<HtWt>[] solutions, int current_index) {
        if (current_index >= array.size() || current_index < 0) {
                return;
        }
        HtWt current_element = array.get(current_index);
        
        // Find longest sequence that we can append current_element to
        ArrayList<HtWt> best_sequence = null;
        for (int i = 0; i < current_index; i++) {
                if (array.get(i).isBefore(current_element)) { // If current_element is bigger than list tail
                        best_sequence = seqWithMaxLength(best_sequence, solutions[i]); // Set best_sequence to our new max
                }
        }
        
        // Append current_element
        ArrayList<HtWt> new_solution = new ArrayList<HtWt>();
        if (best_sequence != null) {
                new_solution.addAll(best_sequence);
        } 
        new_solution.add(current_element);
        
        // Add to list and recurse
        solutions[current_index] = new_solution;
        longestIncreasingSubsequence(array, solutions, current_index + 1);
	}
	
	// Returns longer sequence
    private static ArrayList<HtWt> seqWithMaxLength(ArrayList<HtWt> seq1, ArrayList<HtWt> seq2) {
            if (seq1 == null) {
                    return seq2;
            } else if (seq2 == null) {
                    return seq1;
            }
            return seq1.size() > seq2.size() ? seq1 : seq2;
    }
    
    public static ArrayList<HtWt> getIncreasingSequence(ArrayList<HtWt> items) {
        Collections.sort(items);
        return longestIncreasingSubsequence(items);
    }
}







2019年南海区青少年信息学奥林匹克竞赛(小学甲组) **数据范围与提示** 阅读详情

相关推荐

电子学会C/C++编程等级考试2023年12月(五级)真题解析

题目包括:书架、抓牛、鸣人和佐助、献给阿尔吉侬的花束

人生就是一个不断学习的过程 707

c++贪心 叠罗汉

农场的N头奶牛喜欢玩叠罗汉游戏,就是几头奶牛1头奶牛接着1头奶牛的站成一柱子形状。不过奶牛的力量不一样,用数值Ci表示第i头奶牛它的上面最多可以站多少头奶牛,问这些奶牛最少可以站成几个柱子形状。

SSSHGX的博客 805

C/C++图形界面汉罗塔问题求解

汉诺塔问题是一个经典的数学难题,它涉及到递归思想的运用和分治策略的实现。问题的核心是通过最少的移动次数将一系列不同大小的圆盘从一个塔座移动到另一个塔座,且在移动过程中必须遵守以下规则:每次只能移动一个圆盘;圆盘只能从塔顶移出并放置到另一个塔顶;大圆盘不能放在小圆盘上面。汉诺塔问题不仅是一个单纯的数学游戏,它在计算机科学中也有广泛的应用,特别是在学习递归算法时,是一个重要的示例问题。通过解决汉诺塔问题,可以帮助我们更好地理解递归调用的过程以及递归算法的优缺点。

weixin_28729843的博客 730

[贪心] 奶牛叠罗汉

今天来给大家讲奶牛叠罗汉这道题 题目描述:有n头奶牛,每头奶牛有两个属性:重量w和强壮度s。现在这些奶牛要玩一个叠罗汉的游戏,即一头奶牛要站在另一头奶牛的背上。最后只有一头奶牛站在地面上,从上到下刚好有n层。这时候,奶牛的难受值为它背上的奶牛重量之和减去它自己的强壮度。难受值的最小值为0. 请问,要如何安排奶牛叠罗汉的顺序,才能使最难受的奶牛的难受值最小。 输入格式 第一行,一个正整数,表示n。 接下来有n行,每行两个整数,分别表示一头奶牛的重量和强壮度。 输出格式 一个整数,表示最难受的奶牛的最小难受值。

Minecraftwzy的博客 1005

2014年南海区青少年信息学奥林匹克竞赛试题(小学甲组)

2014年南海区青少年信息学奥林匹克竞赛试题(小学甲组)

数据去重复_京东商品评论情感分析|文本数据预处理

本文爬取了十款热销手机的文本评论数据后,首先对文本评论数据做文本预处理,文本评论数据中存在大量的无价值信息,引入无用的文本数据,对其作情感分析,显然没有价值,得出的文本挖掘结果也不尽人意。所以对于文本评论数据先进行文本预处理是必不可少的一步,把大量的、冗余的、无价值的信息去除,可以极大提高文本数据的质量,精确文本分析结果。1 文本去重1.1文本去重的原因文本数据预处理时,首先应去除文本评论数据中反...

weixin_34556808的博客 2073

第1题 打印方阵

个数的和,就称这个数是可以表示的数。问给定的数列里有多少个数是可以表示的数。头奶牛它的上面最多可以站多少头奶牛,问这些奶牛最少可以站成几个柱子形状。请编程计算两个分数相减的结果。头奶牛的站成一柱子形状。不过奶牛的力量不一样,用数值。在试镜期间,您已经评估了每头奶牛的天赋和技能。你是比赛的初级制作人。下面这样的方阵很有规律,称为蛇形方阵。你的任务是决定哪些奶牛进入选拔的第二阶段。第5题 可表示的数。第4题 集合的差。现在给定边长,输出相应的蛇形方阵。请计算能进入第二阶段的奶牛的数量。

ff5678956789的博客 1188

windchill安装搭建(保姆式)

保姆式搭建windchill 材料准备 Vmware工具,用来创建和打开虚拟机的工具 安装系统的镜像文件 数据库安装文件,这里是Oracle数据库 Windchill的安装包 Vmware工具,用来安装和打开虚拟机的软件 Windowsserver2008的镜像工具,用来安装虚拟机环境的系统,如果你有win2007或win2010的也可以,在做虚拟机时,需要先安装系统。 Oracle数据库安装包 Windchill11M030的安装包 (安装包如有需要可以私信邮箱发送) 虚拟机安装 安装虚拟机VMware

tr1294937662的博客 6217

叠罗汉游戏

农场的N头奶牛喜欢玩叠罗汉游戏,就是几头奶牛1头奶牛接着1头奶牛的站成一柱子形状

knight__OLT的博客 635

Camera Sensor接口协议全解析(六)聚焦onsemi HiSPi接口的技术突破与应用实践

摘要: Onsemi HiSPi是一种高速并行接口协议,专为高分辨率图像传感器设计,具备1600 Mbps传输速率、低功耗和高兼容性特点。通过对比DVP、MIPI CSI-2等主流协议,HiSPi在工业/医疗领域表现突出,支持动态功耗控制、多ROI和CRC校验。其创新架构包含多PHY设计,提供分组SP、流SP等多种工作模式,满足灵活传输需求。实际应用中,HiSPi在PCB缺陷检测(5μm精度)和液晶面板检测(0.3% Mura检出率)等场景展现卓越性能,成为高速成像领域的关键技术。

GateWorld的博客 1435

comfyui从入门到精通二:提示词规则详解

《AI绘画提示词使用全指南》摘要: 本文系统解析AI绘画提示词的核心规则与实用技巧。关键点包括:1) 空格与下划线的本质差异,webui会自动转换但comfyui保留原格式;2) 数字与单词表达(如1girl/one girl)会导致风格变化;3) 三种权重控制方式(数值标注、括号嵌套、位置效应),其中数值标注最直观有效;4) 位置衰减公式揭示提示词排序对效果的影响权重。同时指出当前AI绘画仍存在角色一致性等更复杂的技术瓶颈。全文通过多组对比实验,为创作者提供从基础语法到高阶控制的完整解决方案。

ScottePerk的博客 1923

C++超级书架(深度优先搜索)

C++超级书架(深度优先搜索) Farmer John 最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。 所有 )N(1≤N≤20) 头奶牛都有一个确定的身高 Hi (1≤Hi≤1,000,000)。设所有奶牛身高的和为 S。书架的高度为 B,并且保证 1≤B≤S。 为了够到比最高的那头奶牛还要高的书架顶,奶牛...

Keven_11的博客 2748

Sentinel--哨兵系列数据下载地址及流程更新【202310】

哨兵系列数据下载地址及流程更新。哨兵系列卫星作为哥白尼计划的一部分,主要目标便是对地球的观测任务。哥白尼计划由三部分组成:空间部分(哨兵系列太空任务与其他太空机构任务)、测量部分(提供海洋、大陆表面和大气信息的陆基和机载数据收集网络)、数据管理与全球共享。

twg666的博客 3万+

c++习题:书架(贪心)

John 最近买了一个书架,用来存放奶牛养殖方面的书籍,但书架很快被装满了,只剩最顶层有空余。John 共有 N 头奶牛 (1≤N≤20000), 每头奶牛有自己的高度 Hi(1≤Hi≤10000), N 头奶牛的总高度为 S, 书架高度为 B (1≤B≤S <2000000007)。为了到达书架顶层, 奶牛可以桌着其他奶牛的背,像叠罗汉一样,直到它们的总高度不低于书架高度。问题分析:这是一道十分简单的贪心题目,我们只需要将牛进行排序,然后叠罗汉并同时计数就可以解决了。达到书架高度所需要的奶牛的最少数量。

Sz_winwater的博客 1173

Unity零基础到入门 ☀️| 基础知识入门篇章,看完就可以做游戏啦! | 寻找C站宝藏

Unity入门基础知识。本篇文章介绍了关于Unity入门的一些基础知识,包括基本概念和使用实例。简单易上手,轻松实现Unity入门操作!

努力前行,总会成为自己心中的那道光 1万+

【主题建模】一种基于深度学习的主题建模方法:BERTopic(理论篇)

在我的博客中已经写了很多关于主题建模的内容,当你准备了解 BERTopic 时,默认你已经知道了 LSA、pLSA、NFM、LDA 等传统的主题建模方法。关于主题建模的前置知识我在这里不做赘述,感兴趣的同学可以看看我前几篇博客。学习 BERTopic 需要一定的机器学习基础,让我们一起开始吧!

Data · Model · Agent · Repeat 9892

<C/C++>问题 C: 叠罗汉

题目描述 又到了系列书籍发售的时候了,在ACM俱乐部团队的办公室里堆着许多新版的全书准备出售。 团队成员平时喜欢用全书叠罗汉,以此来锻炼身体。不过,他们是按照一定的规则来叠的,规则如下: (为方便起见,我们用D代表数据结构全书用P代表计算机组成原理全书,用O代表操作系统全书,用N代表计算机网络全书。) (1)D可以叠在P、O、N三者任意一个的上面,但是D上面就不能再叠其他的书了。 (2)P、O、N三者可以互相层叠,也可以多本P(或O、N)叠在一起。但是,不允许大于等于2本的D叠在一起。 (3)D的下方必须至

LJ的博客 973

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

算法大师! 1115

叠罗汉I

叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。同时我们应该让下面的人比上面的人更高一点。已知参加游戏的每个人的身高,请编写代码计算通过选择参与游戏的人,我们多能叠多少个人。注意这里的人都是先后到的,意味着参加游戏的人的先后顺序与原序列中的顺序应该一致。 给定一个int数组men,代表依次来的每个人的身高。同时给定总人数n,请返回最多能叠的人数。保证n小于等于500。 测试样例: [1...

weixin_34355559的博客 334

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

叠罗汉

题目描述 叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。同时我们应该让上面的人比下面的人更高一点。已知参加游戏的每个人的身高,请编写代码计算通过选择参与游戏的人,我们多能叠多少个人。注意这里的人都是先后到的,意味着参加游戏的人的先后顺序与原序列中的顺序应该一致。 给定一个int数组men,代表依次来的每个人的身高。同时给定总人数n,请返回做多能叠的人数。保证n小于等于

Before1993的专栏 1394

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

9.2练习题3 叠罗汉 题解

题目出处:洛谷 P2676,不过题目描述改掉了,程序也稍有不同。 题目描述 茜茜和聪聪是关系很好的同桌,有一天,茜茜觉得天空中的白云像棉花糖一样,应该很好吃吧,但是够不着,她很烦恼。 聪聪为了帮助茜茜解决烦恼,决定帮他把天空中的白云摘下来做成棉花糖给她吃。 但是聪聪也够不着。于是他购买了 \(n\) 个AI3403型超级机器人来帮助他摘天空中的白云。 这些机器人可以采取叠罗汉的方式第在一...

1022

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

USACO-奶牛叠罗汉--交换法贪心思想

Cow Acrobats Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4433   Accepted: 1704 Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are pl

Flere825的博客 1619

叠罗汉II

题目描述 叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。为了使叠成的罗汉更稳固,我们应该让上面的人比下面的人更轻一点。现在一个马戏团要表演这个节目,为了视觉效果,我们还要求下面的人的身高比上面的人高。请编写一个算法,计算最多能叠多少人,注意这里所有演员都同时出现。 给定一个二维int的数组actors,每个元素有两个值,分别代表一个演员的身高和体重。同时给定演员总数n

Before1993的专栏 962

[AcWing] 125. 耍杂技的牛(C++实现)贪心---推公式例题

[AcWing] 125. 耍杂技的牛(C++实现)贪心---推公式例题1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路: 贪心 -----> 每次在当前的选法中,选择能选的情况中的最优解 解题思路: 代码实现思路: 按上述结论将每头牛从小到大叠罗汉(排序),然后求出最大的风险即可。 3. 解法 -----------------------------------

cloud的博客 1690
上一篇: Sorting_Searching 有序矩阵中查找数 @CareerCup
下一篇: Recursion 创新工厂招聘:凑硬币
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值