Description
你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点:

1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。
2.碎纸机切出的每个纸片上都包括一个数。
3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。

举一个例子,如下图,假设目标数是50,输入纸片上的数是12346。碎纸机会把纸片切成4块,分别包含1,2,34和6。这样这些数的和是43
(= 1 + 2 + 34 + 6),这是所有的分割方式中,不超过50,而又最接近50的分割方式。又比如,分割成1,23,4和6是不正确的,因为这样的总和是34 (= 1 + 23 + 4 + 6),比刚才得到的结果43小。分割成12,34和6也是不正确的,因为这时的总和是52 (= 12 + 34 + 6),超过了50。

还有三个特别的规则:
1.如果目标数和输入纸片上的数相同,那么纸片不进行切割。
2.如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印机显示错误信息。
3.如果有多种不同的切割方式可以得到相同的最优结果。那么打印机显示拒绝服务信息。比如,如果目标数是15,输入纸片上的数是111,那么有两种不同的方式可以得到最优解,分别是切割成1和11或者切割成11和1,在这种情况下,打印机会显示拒绝服务信息。

为了设计这样的一个碎纸机,你需要先写一个简单的程序模拟这个打印机的工作。给定两个数,第一个是目标数,第二个是输入纸片上的数,你需要给出碎纸机对纸片的分割方式。
Input
输入包括多组数据,每一组包括一行。每行上包括两个正整数,分别表示目标数和输入纸片上的数。已知输入保证:两个数都不会以0开头,而且两个数至多都只包含6个数字。

输入的最后一行包括两个0,这行表示输入的结束。
Output
对每一组输入数据,输出相应的输出。有三种不同的输出结果:

sum part1 part2 … rejected error

第一种结果表示:
1.每一个partj是切割得到的纸片上的一个数。partj的顺序和输入纸片上原始数中数字出现的次序一致。
2.sum是切割得到的纸片上的数的和,也就是说:sum = part1 + part2 +… 第一种结果中相邻的两个数之间用一个空格隔开。

如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印“error”。
如果有多种不同的切割方式可以得到相同的最优结果,那么打印“rejected”。
Sample Input
50 12346
376 144139
927438 927438
18 3312
9 3142
25 1299
111 33333
103 862150
6 1104
0 0
Sample Output
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

dfs:在dfs的过程中,记录当前位,当前位前面拆分之和,并用一个now数组来存储当前位,因为条件要求拆分出的数之和必须是小于n的,所以,在这里我们可以加一个剪枝,也就是说当前面的和加上当前拆分的数>n,我们就可以return,不再继续搜索。当搜索长度大于m时,也就意味着我们已经把所有的位数拆分完了,这时候,我们将其与现在的最大值进行比较,如果它更大,我们就更新最大值,再用一个step数组记录对于当前的拆分情况,每个数是多少,每次不断进行更新。
因为题面上说如果有多种不同的切割方式可以得到相同的最优结果,那么打印“rejected”,那么我们开一个vis数组,每次当拆分完这个数的时候,对于当前的sum,vis【sum】++,最后再判断vis【ans】是否大于1就可以得出结果了

代码实现:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,m,ans,vis[1000005],num,step[15],now[15];
char s[15];
void dfs(int dq,int sum,int cnt)
{if(dq>=m){vis[sum]++;if(sum>ans){ans=sum;num=cnt;for(int i=0;i<cnt;i++)step[i]=now[i];}return;                                     }int t=0;for(int i=dq;i<m;i++){t=t*10+s[i]-'0';if(sum+t>n)return;now[cnt]=t;dfs(i+1,sum+t,cnt+1);}
}
int main()
{int sum;while(scanf("%d%s",&n,s)!=EOF){m=strlen(s);if(n==0&&s[0]=='0'&&m==1) break;sum=0;for(int i=0;i<m;i++)sum+=s[i]-'0';if(sum>n){printf("error\n");continue;}memset(vis,0,sizeof(vis));num=0,ans=0;dfs(0,0,0);if(vis[ans] > 1) printf("rejected\n");  else{  printf("%d",ans);  for(int i = 0;i < num;i ++)  printf(" %d",step[i]);  printf("\n");  }   }return 0;
}

OpenJudge noi1805碎纸机相关推荐

  1. OpenJudge 2803 碎纸机 / Poj 1416 Shredding Company

    1.链接地址: http://poj.org/problem?id=1416 http://bailian.openjudge.cn/practice/2803 2.题目: 总时间限制: 1000ms ...

  2. 得力计算机无法开机,得力碎纸机维修常见故障及解决办法分享

    碎纸机中,得力品牌的我们也是没少见了,得力碎纸机近几年也是得到大家的认可.所有东西用久了都会出现故障,所以今天小编整理了得力碎纸机维修常见故障及解决办法,供大家参考~ 得力碎纸机维修常见故障及解决办法 ...

  3. 【专题5: 硬件设计】 之 【30.案例三:碎纸机,DC-DC降压方法(电容降压原理)】

    希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所有文章总目录:[嵌入式 无人机 电机控制 ...

  4. 【专题5: 硬件设计】 之 【39.案例三:碎纸机,光电传感器电路原理图】

    嵌入式工程师成长之路 系列文章 总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所 ...

  5. 【专题5: 硬件设计】 之 【32.案例三:碎纸机,比较器】

    希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所有文章总目录:[嵌入式 无人机 电机控制 ...

  6. 攻防世界_MISC之碎纸机11

    emmm,研究了一会,也看了官方的wp用的是脚本,只能说,小生惭愧,看布懂 利用网站手工 通过观察可以发现,图片名字无序 按日期升序,打开第三张图片,可以发现两块二维码的定位符,证明出题人没把修改日期 ...

  7. 2013高教社杯---B碎纸片的拼接复原

    破碎文件的拼接在司法物证复原.历史文献修复以及军事情报获取等领域都有着重要的应用.传统上,拼接复原工作需由人工完成,准确率较高,但效率很低.特别是当碎片数量巨大,人工拼接很难在短时间内完成任务.随着计 ...

  8. matlab碎纸拼接相似函数,基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法

    基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法 [专利摘要]本发明提供了一种基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法,主要涉及双面打印文件的拼接及复原问题,通常由于图片较多,信息量较大,故通常为 ...

  9. Talk about----计算机发展编年史

    一.史前时代[1623--1895] 1623年:德国科学家契克卡德(W. Schickard)制造了人类有史以来第一台机械计算机,这台机器能够进行六位数的加减乘除运算.   1642年:法国科学家帕 ...

最新文章

  1. vivado环境下用Verilog语言实现编码器
  2. boost::log::dynamic_type_dispatcher用法的测试程序
  3. 中国经济蓝皮书发布 该死的房价下降成定局
  4. PyTorch学习—11.权值初始化
  5. windows c++ 服务 当前用户提权_关于Windows下的提权方式(上)
  6. 【电路仿真】基于matlab Simulink四旋翼PID控制【含Matlab源码 454期】
  7. Java 递归算法之斐波那契数列第 N 项
  8. 利润表模板excel_德勤HR:请1小时内,用Excel搭建哔哩哔哩财务估值模型
  9. ArcMAP问题集锦(一)
  10. 数字条纹投影系统中基于概率分布函数的灵活伽玛计算算法
  11. kettle官网下载
  12. phoenix查不到数据_Phoenix查询测试经验总结
  13. Win32反汇编(一) 初步探索Win32反汇编 与 Ollydbg的简单使用
  14. Windows 7 更新补丁大包子
  15. 智力题集锦与详解——持续更新
  16. 足球运动员的数据分析实战(python)
  17. hiho 大礼堂地毯(strstr 查找函数)
  18. 如何打开html的文档结构图,如何在Word中设置文档结构图
  19. 前端面试自我介绍的技巧都有哪些?
  20. 手机短信验证码解决方案

热门文章

  1. 360腾讯计算机比赛,XP挑战赛:腾讯电脑管家完胜360 XP盾甲
  2. P4编程理论与实践——理论篇(转载)
  3. 山东科技大学c语言,C语言练习题(山东科技大学吐血整理)-
  4. python入门心得_python入门零基础心得(一)
  5. Maven项目中pox.xml文件报错以及项目编译错误
  6. CiteSpace的安装
  7. 详解CAN的高层协议(三)
  8. 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档)
  9. 一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成
  10. linux下安装rar命令