下面我们来分析一下这个题目,感觉今年的题目阅读起来简单了很多啊。
首先给了一堆的绳子,绳子有长有短,长度的单位都是厘米。绳子分为蓝色或者红色的。
我们的任务是需要按照相邻绳子不能是同一种颜色的规则把这些绳子尽量的围成最大的环形。其中特别提到,打一个扣,消耗1厘米的长度。
也就是说有一红一蓝两根绳子的话,最后的长度是它们的长度和再减去2厘米。
文件里的数据格式是:
首先给出这个文件里有多少个例子
然后给出第一个例子有多少个绳子
然后给出每段绳子的长度+颜色,用空格分隔每段绳子的属性
然后以此类推
下面我们开始分析解法
首先读文件第一个数据,放到N里,表示有这么多例子,我们接下来要循环读这么多次。
弄两个数组来存放R和B,把颜色分开,R[],B[]。
数据读完了,算一下LR和LB代表两个的长度,那么min(LR-LB)=L的值就是有多少对绳子可用了,根据题目分析,必然绳子得是偶数,成对出现才能使用。
然后把R[],B[]按大小排序
计算前L对长度,然后减去L厘米,因为打结有损耗,结果就出来了。
首先我们发现,数组的长度不好固定,看看题目限制,最多1000个绳子,那就可以定义两个长度为1000的数组。
然后又发现大小排序够麻烦的,C里面还有没sort函数可以直接用,用链表在读入数据的时候就按大小插入吧,代码量实现起来又太费劲了。得想个简单的方法。
绳子的长度限制到1到100,恩,想到了哈希表。然后就想到了一个长度为100的数组,每个元素表示一个定长的空间,而两个相同颜色相同长度的绳子之间没有分别,于是,简单的在这个长度上加个1,表示这个长度的绳子有2个,这就比较简单了。这样的话存储空间变成了R[100],B[100]小了很多。这样的话就在定义两个数来表示LR,LB长度信息就可以了。
这样在算的时候,先通过LR,LB求出L来,然后来个100的循环,把i代表的长度信息加起来,最后减去一个L就可以了。由于RB不能同步的移动i,于是用ij组合好了。
最后我们发现,得到L之后,要对RB两个数字各遍历L次,理论上有更小的计算开销,我就没继续想下去了。每次把2条绳子长度加起来就要减去一个2厘米的损耗,最后得到的就是结果。小数据集结果提交已经正确了。