问题描述
计算机学院2013级的院草语文难同学是软院院花牟黑黑爱慕的对象,因此牟黑黑经常约楠神去逛街,楠神不喜欢陪牟黑黑逛街,但是不得不从啊。所以在牟黑黑逛街的时候他就无聊的用眼睛识别条形码 。
在生活中,条形码经常用来标志物品的信息。条形码是由黑白相间的条组成的。条的宽度有两种,我们可以认为窄的代表0,宽的代表1。本题中设定宽条的宽度是窄条的两倍。
楠神拥有很强的DIY精神,他决定做一个条形码识别工具。首先他完成了图像识别部分,得到了一系列条的宽度。他希望将这些宽度识别为一个01串。本来这是一个非常简单的任务,可是由于楠神在识别的时候会有误差,使得问题变得没那么简单了。不过楠神认为测量得到的结果最多比真实值大或小5%。请你帮忙完成这个识别程序。已知条形码中至少有一个是宽条,可能没有窄条。
输入第一行为一个数字n(n<20),表示楠神识别出了n个条。
第二行为n个正整数,均不大于10^8。
输出为一个长度为n的01串,宽条对应1,窄条对应0。如果有些条偏差的超过了限制,输出“Bad Barcodes”
| 测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
整体思路:
整体思路就是对给出的数据进行排序,根据最值得情况来判断改组数据是不是合法,是不是只有宽条,处理好多%5少%5就好了。
具体实现:
讨论区里面大神们已经用各种不同的方法得到了结果,我这里就不说了就给出几个判定的等式
宽Max/窄min<=1.05/0.95
窄Max/窄min<=1.05/0.95
宽Max/窄min<=2.1/0.95
宽min/窄Max>=1.9/1.05
因为一共只有20个数所以可以有比较多的方法。
实现代码
<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#include<stdlib.h>
int cmp(const void *x,const void *y)
{return *(int*)x-*(int*)y;
}
int main()
{int n,i;long ch[23],lin[23],l[23];double sky1,sky2;double zhong;scanf("%d",&n);for(i=0;i<n;i++){scanf("%ld",&ch[i]);lin[i]=ch[i];}qsort(ch,n,sizeof(ch[0]),cmp);zhong=(ch[0]+ch[n-1])/2;if(ch[0]/0.95>=zhong){for(i=0;i<n;i++){ //判断全部为宽的情况 printf("1");}printf("\n");}else{for(i=0;i<n;i++){if(ch[i]<=zhong){l[i]=ch[i]*2;}else{l[i]=ch[i];}}qsort(l,n,sizeof(l[0]),cmp);if(l[0]/0.95>=l[n-1]/1.05){for(i=0;i<n;i++){if(lin[i]<zhong){printf("0");}else{printf("1");}}printf("\n");}else{printf("Bad Barcodes\n");}}return 0;
}</span>