#P3287. The Trip, 2007

The Trip, 2007

题目描述

一群学生每年都会参加一个俱乐部的异国旅行。过去的旅行地点包括印第安纳波利斯、凤凰城、纳什维尔、费城、圣何塞、亚特兰大、埃因霍温、奥兰多、温哥华、檀香山、比佛利山庄、布拉格、上海和圣安东尼奥。今年春天,他们希望进行一次类似的旅行,但还不确定具体地点和时间。

旅行中的一个问题是,慷慨的赞助商总会送给他们各种背包和行李袋,他们必须在回家时打包这些袋子。由于航空公司对行李件数有限制,他们决定将袋子嵌套打包,以最小化必须携带的行李件数(即最外层袋子的数量)。

所有袋子的形状完全相同,仅线性尺寸不同(尺寸为不超过1000000的正整数)。较小尺寸的袋子可以嵌套在较大尺寸的袋子中。你的任务是计算如何将袋子嵌套打包,使得:

  1. 行李件数最少(即最外层袋子的数量最少);
  2. 在满足条件1的前提下,单个行李件中的袋子数量尽可能少

输入格式

标准输入包含多个测试用例。每个测试用例包含:

  • 第一行是一个整数 ( 1 \leq n \leq 10000 ),表示袋子的数量;
  • 接下来一行或多行包含 ( n ) 个整数,表示每个袋子的尺寸;
  • 输入以一行包含 ( 0 ) 的测试用例结束。

输出格式

对每个测试用例,输出:

  • 第一行是最少行李件数 ( k );
  • 接下来 ( k ) 行,每行列出一个行李件中从内到外的所有袋子尺寸(需满足嵌套条件,即尺寸严格递增);
  • 每个输入中的尺寸必须在输出中恰好出现一次,且同一行李件中的袋子必须能嵌套(小尺寸在内,大尺寸在外);
  • 若有多个解,输出任意一个即可;
  • 测试用例之间用空行分隔。

输入数据示例 1

6  
1 1 2 2 2 3  
0  

输出数据示例 1

3  
1 2  
1 2  
3 2  

来源

Waterloo Local Contest, 2006.9.24