#P1416. Shredding Company

Shredding Company

题目描述

你刚刚被任命为碎纸机公司开发一款新型碎纸机。尽管“普通”碎纸机只是将纸张切成小碎片,使内容无法阅读,但这款新型碎纸机需要具备以下特殊的基本特性。

  1. 碎纸机的输入包括一个目标数字和一张写有数字的纸张。
  2. 它将纸张切碎(或切割)成多个碎片,每个碎片上有一个或多个数字。
  3. 每个碎片上的数字之和尽可能接近目标数字,但不能超过它。

例如,假设目标数字是5050,纸张上的数字是1234612346。碎纸机会将纸张切成四部分,其中一部分是11,另一部分是22,第三部分是3434,第四部分是66。这是因为它们的和4343=1+2+34+6= 1 + 2 + 34 + 6)是所有可能组合中最接近目标数字5050且不超过5050的组合。例如,组合1123234466是无效的,因为它们的和3434=1+23+4+6= 1 + 23 + 4 + 6)小于之前的4343。而组合1212343466也是无效的,因为它们的和5252=12+34+6= 12 + 34 + 6)超过了目标数字5050

图1. 当目标数字为5050时,对写有数字1234612346的纸张进行切割

此外,还有三条特殊规则:

  1. 如果目标数字与纸张上的数字相同,则不切割纸张。
    例如,如果目标数字是100100,纸张上的数字也是100100,则不切割纸张。

  2. 如果无法找到任何组合的和小于或等于目标数字,则在显示器上打印“error”。
    例如,如果目标数字是11,纸张上的数字是123123,则无法生成任何有效组合,因为最小的可能组合是112233,其和为66,大于目标数字,因此打印“error”。

  3. 如果有多个组合的和最接近目标数字且不超过它,则在显示器上打印“rejected”。
    例如,如果目标数字是1515,纸张上的数字是111111,则存在两种可能的组合,其和均为1212:(a) 111111;(b) 111111;因此打印“rejected”。

为了开发这款碎纸机,你决定先编写一个简单的程序来模拟上述特性和规则。给定两个数字,第一个是目标数字,第二个是待切割的纸张上的数字,你需要计算出碎纸机应如何“切割”第二个数字。

输入

输入包含多个测试用例,每个测试用例占一行,格式如下:

t1 num1
t2 num2
...
tn numn
0 0

每个测试用例包含以下两个正整数,用一个空格分隔:
(1) 第一个整数(即上述的titi)是目标数字,(2) 第二个整数(即上述的numinumi)是纸张上待切割的数字。

两个整数的首位数字均不为00,例如123123是允许的,但01230123不允许。假设两个整数的长度最多为66位。一行输入两个00表示输入结束。

输出

对于每个测试用例,输出对应以下三种类型之一:

sum part1 part2 ...
rejected
error

在第一种类型中,partjpartjsumsum的含义如下:

  1. 每个partjpartj表示一个碎片上的数字,其顺序与纸张上原始数字的顺序一致。
  2. sumsum是切割后所有数字的和,即sum=part1+part2+...sum = part1 + part2 + ...

每个数字之间用一个空格分隔。

如果无法生成任何有效组合,则输出“error”;如果有多个最优组合,则输出“rejected”。

每行的开头或末尾不允许有多余的空格或其他字符。

输入数据 1

50 12346  
376 144139  
927438 927438  
18 3312  
9 3142  
25 1299  
111 33333  
103 862150  
6 1104  
0 0  

输出数据 1

43 1 2 34 6  
283 144 139  
927438 927438  
18 3 3 12  
error  
21 1 2 9 9  
rejected  
103 86 2 15 0  
rejected  

来源

Japan 2002 Kanazawa