11.识别条形码
成绩 | 10 | 开启时间 | 2016年09月6日 星期二 11:00 |
折扣 | 0.8 | 折扣时间 | 2016年09月12日 星期一 23:55 |
允许迟交 | 否 | 关闭时间 | 2016年10月10日 星期一 23:55 |
计算机学院2013级的院草语文难同学是软院院花牟黑黑爱慕的对象,因此牟黑黑经常约楠神去逛街,楠神不喜欢陪牟黑黑逛街,但是不得不从啊。所以在牟黑黑逛街的时候他就无聊的用眼睛识别条形码 。
在生活中,条形码经常用来标志物品的信息。条形码是由黑白相间的条组成的。条的宽度有两种,我们可以认为窄的代表0,宽的代表1。本题中设定宽条的宽度是窄条的两倍。
楠神拥有很强的DIY精神,他决定做一个条形码识别工具。首先他完成了图像识别部分,得到了一系列条的宽度。他希望将这些宽度识别为一个01串。本来这是一个非常简单的任务,可是由于楠神在识别的时候会有误差,使得问题变得没那么简单了。不过楠神认为测量得到的结果最多比真实值大或小5%。请你帮忙完成这个识别程序。已知条形码中至少有一个是宽条,可能没有窄条。
输入第一行为一个数字n(n<20),表示楠神识别出了n个条。
第二行为n个正整数,均不大于10^8。
输出为一个长度为n的01串,宽条对应1,窄条对应0。如果有些条偏差的超过了限制,输出“Bad Barcodes”
首先,理解一下思路。输入n个数,即为楠神检测出来的条形码的宽度,每个宽度不准确,会有5%上下误差。值得注意的点是一定有宽条纹,则当所有的条形码宽度相差不大时应该输出全1数列。
我们需要做的是先找出最宽和最窄的条形码,如果这两个条形码经过5%误差处理后,仍旧相差不大,则说明整个数列基本上是全宽条形码,只需输出全1;若最宽最窄条形码相差较大,则说明既有宽条码,也有窄条码,我们可以找到一个中间值将条形码分离,定义为threshold = ( max + min ) / 2,因为需要考虑误差成分,我们只需确定一个大致的中间值,可以将数据分开即可。每次条形码大于threshold时,直接判断为宽条码,若小于threshold,则初始判断为窄条纹,并将该数据双倍写回数组,为之后进行的二次判断条码是否合理做准备。
全部扫描之后,对处理后的数组进行判断,若此时的最大最小值经5%处理后仍旧不符合min / 0.95 >= max / 1.05则输出“Bad Barcodes”,不然输入数据合法可以直接输出刚才判断的条码01串。
结果: