news 2026/6/11 22:43:02

UVa 456 Robotic Stacker

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 456 Robotic Stacker

题目描述

题目要求模拟将一列包装箱(每组包含111444个单元箱)堆放到一个666英尺长、202020英尺高的货箱中。货箱宽度为111英尺,每个单元箱是1×1×11 \times 1 \times 11×1×1英尺的立方体。包装箱必须完整放置,不能拆分。放置时,包装箱可以水平放置(占据连续多个位置)或垂直放置(在同一个位置上堆叠)。水平放置时,包装箱必须被其下方的整个长度完全支撑(即下方所有对应位置的高度必须相同)。目标是按输入顺序尽可能多地放置包装箱,并输出成功放置的包装箱数量以及最终剩余的空位数量(总容量为6×20=1206 \times 20 = 1206×20=120个单元箱)。

输入格式

输入包含若干行,每行一个由数字111222333444组成的字符串,表示包装箱的大小序列。输入以文件结束符(EOF\texttt{EOF}EOF)终止。

输出格式

对于每行输入,输出一行两个整数:成功放置的包装箱数量和剩余的空位数量。

样例

输入

4444444444444444444444444444444444444444444444444444444444444 3333333333333333333333333333333333333333333333333333333333333

输出

30 0 39 3

题目分析

本题的核心是贪心模拟堆叠过程。每次处理一个包装箱时,优先尝试水平放置,若不能则尝试垂直放置,若两者均不能则停止。

状态表示

使用数组bin[6]\textit{bin}[6]bin[6]表示每个位置当前的高度(已放置的单元箱层数),初始全为000。每个位置最大高度为202020

水平放置

对于大小为ppp的包装箱,尝试在0006−p6-p6p之间寻找起始位置jjj,使得:

  • bin[j]\textit{bin}[j]bin[j]bin[j+p−1]\textit{bin}[j+p-1]bin[j+p1]的高度相同(保证支撑面平整)。
  • 该高度小于202020(因为放置后不能超过202020)。

若找到,则将bin[j]\textit{bin}[j]bin[j]bin[j+p−1]\textit{bin}[j+p-1]bin[j+p1]各加111,表示放置成功。

垂直放置

若水平放置失败,则尝试在任意位置jjj上垂直堆叠(即包装箱竖着放,占据该位置的ppp个单元箱)。要求bin[j]+p≤20\textit{bin}[j] + p \le 20bin[j]+p20。选择第一个满足条件的位置放置,并将bin[j]\textit{bin}[j]bin[j]增加ppp

终止条件

若水平放置和垂直放置均失败,则后续包装箱均无法放置,停止处理。

输出

成功放置的包装箱数量即为处理到的位置数(从000开始计数)。剩余空位数 =120120120- 已放置的单元箱总数。

贪心策略的合理性

优先尝试水平放置可以保持高度均匀,为后续包装箱创造更多的水平放置机会。垂直放置是后备方案。该贪心策略在本题中可得到最优解。

复杂度分析

每个包装箱最多检查O(6×p)O(6 \times p)O(6×p)个位置,p≤4p \le 4p4,总复杂度O(包装箱数×24)O(\text{包装箱数} \times 24)O(包装箱数×24),完全可接受。

代码实现

// Robotic Stacker// UVa ID: 456// Verdict: Accepted// Submission Date: 2017-02-25// UVa Run Time: 0.000s//// 版权所有(C)2017,邱秋。metapackageshysis # yeah dot net//// greedy algorithm works, why?//#include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);string s;while(cin>>s){intbin[6]={},stacked=0,boxes=0;for(inti=0;i<s.length();i++,stacked++){intpackages=s[i]-'0';// 尝试将箱子水平放置在集装箱内。boolhorizontal=false;for(intj=0;j<=6-packages;j++){if(bin[j]!=20){boolsupported=true;for(intk=1;k<packages;k++)if(bin[j+k]!=bin[j]){supported=false;break;}if(supported){for(intk=0;k<packages;k++)bin[j+k]++;horizontal=true;break;}}}// 水平放置成功。if(horizontal){boxes+=packages;continue;}// 若水平放置不成功,尝试垂直放置。boolvertical=false;for(intj=0;j<6;j++){if(bin[j]+packages<=20){bin[j]+=packages;vertical=true;break;}}// 若垂直放置不成功,表明该组箱子无法放置。if(!vertical)break;boxes+=packages;}cout<<stacked<<' '<<(120-boxes)<<'\n';}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 22:40:45

2026WebGoC县赛参考答案

题目详见2026WebGoC县赛真题&#xff08;高年级组&#xff09; 第一题&#xff1a; int main(){ for(int i0;i<5;i){p.c(i);p.size(30-5*i);p.fd(60-5*i);}p.hide();return 0; } 输…

作者头像 李华
网站建设 2026/6/11 22:30:55

MPC8541E以太网接口硬件设计:从电气到时序的实战解析

1. 项目概述与接口选择考量在嵌入式网络设备&#xff0c;尤其是路由器、交换机、工业网关等通信设备的核心板卡设计中&#xff0c;处理器与外部物理层芯片&#xff08;PHY&#xff09;之间的连接是决定网络性能与稳定性的基石。飞思卡尔&#xff08;现恩智浦&#xff09;的MPC8…

作者头像 李华
网站建设 2026/6/11 22:30:54

MPC8610 SerDes与PCIe电气规范解析:从参数到硬件设计实践

1. 项目概述与核心价值在嵌入式系统和高速通信板卡的设计中&#xff0c;MPC8610这类集成处理器扮演着核心角色。它内部集成的SerDes&#xff08;串行器/解串器&#xff09;模块&#xff0c;是实现PCI Express这类高速串行接口的物理基础。很多工程师在拿到芯片手册时&#xff0…

作者头像 李华
网站建设 2026/6/11 22:30:06

P89LPC9301/931A1深度解析:80C51内核的现代应用与低功耗设计

1. 项目概述&#xff1a;为什么选择P89LPC9301/931A1&#xff1f;在嵌入式开发领域&#xff0c;尤其是成本敏感、空间受限且对功耗有要求的项目中&#xff0c;选型往往是决定项目成败的第一步。从业十多年&#xff0c;我经手过上百个基于不同内核的MCU项目&#xff0c;从早期的…

作者头像 李华
网站建设 2026/6/11 22:29:08

Athena+S3直接SQL查询实战:零运维高效分析指南

1. 项目概述&#xff1a;为什么你该认真对待“在S3上直接跑SQL”这件事 你有没有过这样的时刻&#xff1a;数据刚从IoT设备、日志系统或第三方API落进S3桶&#xff0c;还没来得及建ETL流水线&#xff0c;业务方就拿着Excel表格冲进会议室&#xff0c;问&#xff1a;“昨天的用户…

作者头像 李华