OpenJudge 2803 碎纸机 / Poj 1416 Shredding Company
1.链接地址:
http://poj.org/problem?id=1416
http://bailian.openjudge.cn/practice/2803
2.题目:
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点:
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,在这种情况下,打印机会显示拒绝服务信息。为了设计这样的一个碎纸机,你需要先写一个简单的程序模拟这个打印机的工作。给定两个数,第一个是目标数,第二个是输入纸片上的数,你需要给出碎纸机对纸片的分割方式。
- 输入
- 输入包括多组数据,每一组包括一行。每行上包括两个正整数,分别表示目标数和输入纸片上的数。已知输入保证:两个数都不会以0开头,而且两个数至多都只包含6个数字。
输入的最后一行包括两个0,这行表示输入的结束。
- 输出
- 对每一组输入数据,输出相应的输出。有三种不同的输出结果:
sum part1 part2 ...
rejected
error第一种结果表示:
1.每一个partj是切割得到的纸片上的一个数。partj的顺序和输入纸片上原始数中数字出现的次序一致。
2.sum是切割得到的纸片上的数的和,也就是说:sum = part1 + part2 +...
第一种结果中相邻的两个数之间用一个空格隔开。如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印“error”。
如果有多种不同的切割方式可以得到相同的最优结果,那么打印“rejected”。- 样例输入
50 12346 376 144139 927438 927438 18 3312 9 3142 25 1299 111 33333 103 862150 6 1104 0 0- 样例输出
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的试题
3.思路:
dfs(深度优先搜索)+剪枝
4.代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <vector> 5 #include <cstdlib> 6 7 using namespace std; 8 9 int max_sum; 10 11 int res_sum; 12 vector<int> res_path; 13 int count; 14 15 int sum; 16 vector<int> path; 17 18 19 void dfs(string str) 20 { 21 //for(int v_i = 0; v_i < path.size(); ++v_i) cout << path[v_i] << " "; cout << "(" << str << ")(" << sum << ")";cout << endl; 22 if(str.size() == 0) 23 { 24 25 if(sum <= max_sum && sum == res_sum) 26 { 27 ++count; 28 //res_path.clear(); 29 //for(int v_i = 0; v_i < path.size(); ++v_i) res_path.push_back(path[v_i]); 30 //for(int v_i = 0; v_i < path.size(); ++v_i) cout << path[v_i] << " "; cout << "(" << str << ")(" << sum << ")";cout << endl; 31 res_path = path; 32 } 33 else if(sum <= max_sum && sum > res_sum) 34 { 35 res_sum = sum; 36 count = 1; 37 //for(int v_i = 0; v_i < path.size(); ++v_i) cout << path[v_i] << " "; cout << "(" << str << ")(" << sum << ")";cout << endl; 38 res_path = path; 39 //res_path.clear(); 40 //for(int v_i = 0; v_i < path.size(); ++v_i) res_path.push_back(path[v_i]); 41 } 42 return; 43 } 44 45 for(int i = str.size() - 1; i >= 0; --i) 46 { 47 string str_left = str.substr(0,i); 48 string str_right = str.substr(i); 49 50 int left = atoi(str_left.c_str()); 51 int right = atoi(str_right.c_str()); 52 53 //剪枝 54 if(sum + right > max_sum) continue; 55 56 //剪枝二 57 if(res_sum == max_sum && count > 1) break; 58 59 sum += right; 60 path.push_back(right); 61 62 dfs(str_left); 63 64 sum -= right; 65 path.pop_back(); 66 } 67 68 return; 69 } 70 71 int main() 72 { 73 //freopen("C://input.txt","r",stdin); 74 75 string str; 76 cin >> max_sum >> str; 77 78 while(max_sum != 0 || str.size() != 1 || str[0] != '0') 79 { 80 int num = atoi(str.c_str()); 81 if(num <= max_sum) 82 { 83 cout << num << " " << num << endl; 84 } 85 else 86 { 87 sum = 0; 88 path.clear(); 89 90 res_sum = -1; 91 92 dfs(str); 93 94 if(res_sum == -1) cout << "error" << endl; 95 else if(count > 1) cout << "rejected" << endl; 96 else 97 { 98 cout << res_sum; 99 for(int i = res_path.size() - 1; i >= 0; --i) cout << " " << res_path[i]; 100 cout << endl; 101 } 102 } 103 104 105 106 cin >> max_sum >> str; 107 } 108 109 return 0; 110 }
转载于:https://www.cnblogs.com/mobileliker/p/3570508.html
OpenJudge 2803 碎纸机 / Poj 1416 Shredding Company相关推荐
- OpenJudge noi1805碎纸机
Description 你现在负责设计一种新式的碎纸机.一般的碎纸机会把纸切成小片,变得难以阅读.而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸 ...
- POJ1416 Shredding Company ACM解题报告(DFS回溯+剪枝)
本渣渣明天C语言考试,今天有点亢奋,又来了一题,这题感觉比前一题难多了,不仅是字符串转化为数字,即使看了百度提醒的搜索树,还是参考了一些百度的代码.感觉道阻且长,我仍需努力.下面是题目翻译: 公司现在 ...
- 得力计算机无法开机,得力碎纸机维修常见故障及解决办法分享
碎纸机中,得力品牌的我们也是没少见了,得力碎纸机近几年也是得到大家的认可.所有东西用久了都会出现故障,所以今天小编整理了得力碎纸机维修常见故障及解决办法,供大家参考~ 得力碎纸机维修常见故障及解决办法 ...
- POJ 3216 Repairing Company【二分图最小路径覆盖】
题意: 告诉你 Q 格街区,一共有 M d 个任务分布在这Q 个街区里面,知道了每个任务的开始时间和需要一个人的完成时间, 问最少需要派多少人才能做完所有的任务. 分析: 求二分图的最小路径覆盖, ...
- 【专题5: 硬件设计】 之 【30.案例三:碎纸机,DC-DC降压方法(电容降压原理)】
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所有文章总目录:[嵌入式 无人机 电机控制 ...
- 【专题5: 硬件设计】 之 【39.案例三:碎纸机,光电传感器电路原理图】
嵌入式工程师成长之路 系列文章 总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所 ...
- 【专题5: 硬件设计】 之 【32.案例三:碎纸机,比较器】
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所有文章总目录:[嵌入式 无人机 电机控制 ...
- POJ 2343 Airline company [DFS编号]
题意:给定一个N点M边的无向图,为每个边编号1~M,若点的入度>1,其相关边编号的最大公约数为1,有解则输出方案. 思路:用DFS进行编号,将同一点的相关边存入向量组,依据gcd(x,x+1)= ...
- poj1416:Shredding Company
这里设置一个flag来记录发生了什么情况,0表示error,1表示正常,2表示拒绝. 逻辑主要如下: 如果和大于当前res并且小于target,那么更新值,记录所有分割情况,标记flag为1,接受 如 ...
最新文章
- 所有顶点对最短路径问题(图的应用)
- Python之目录结构
- lambda表达式可以用来声明_Lambda 的骚操作,你都get到了没
- Keras入门(一)
- Spring Boot之 Configuration Annotation Proessor not found in classpath解决方法
- 絮语之一:悲悯·海·《垂死的肉身》
- Codeforces Round #321 (Div. 2)
- 启用IIS的Gzip压缩功能
- js手机端图片弹出方法
- imply套件以及plyql的安装
- 基于python+django学生信息管理系统设计与实现(毕业论文+毕设源码)
- 笔记篇二:鸢尾花数据集分类
- 分布式开源调度框架TBSchedule原理与应用
- tiktok运营全攻略
- 服务器装xp系统蓝屏怎么办,安装XP系统出现蓝屏的解决办法
- 百家号自媒体的文章在哪个时间段发文效果比较好?
- unity学习之路—飞机大战
- IDEA执行hadoop相关报错xxx from xxx is not a valid DFS filename.
- DataGridView中某一行的某一列及当前行的选取方法(C#实现)
- [HDU1004] Let the balloon rise - 让气球升起来
热门文章
- ieda中快捷搜索_快捷指令(07)早上好(三)播报当日日程安排。
- 连接串口_气压计PTB330连接HMI串口屏
- 8 一点就消失_农村即将消失的15个“老物件”,件件充满回忆,全认识说明你老了...
- SQLAlchemy engine.Engine
- 前端-requests-flask对应关系 json
- 2.7 RMSprop
- neo4j remove
- vcenter server 许可证_朝阳互联网信息服务许可证ICP内资新办时间找杜经理
- golang | windows平台golang环境搭建(过坑之后)
- 游戏盾 > 产品简介 > 产品优势