题目http://acm.pku.edu.cn/JudgeOnline/problem?id=1011
做了两天,一直RE,在网上找了一组又一组的数据,最终发现了异常的地方,47MS通过了。
我的思路是:
设所有子木棍为:S1、S2、S3、、、Sn,且S1>= S2 >= S3 >= … >= Sn
每根拼凑的木棍表示为:Li= {Si1, Si2, Si3… Sim}
定义一个偏序关系:
Li >= Lj 当且仅当
Si1 > Sj1 ||
(Si1 = Sj1 && Si2 > Sj2) ||
(Si1= Sj1 && Si2 = Sj2 && Si3 = Sj3) …即类似字符串的大小关系。
这样,所有最终拼凑出的木棍能够从大到小排列。
在搜索解的时候,按照从大到小的搜索所有木棍,比如,拼出了第一个木棍,再拼第二根木棍的时候,第二根木棍一定要比第一根木棍小。这样可以避免一些可以避免一些重复搜索。
感谢这组数据,测出了我的bug
45
15 3 2 11 4 1 8 8 8 15 3 2 11 4 1 8 8 8 15 3 2 11 4 1 8 8 8 15 3 2 11 4 1 8 8 8
15 3 2 11 4 1 8 8 8
while (next == -1 && index.size() > 1) {
rmvIndex(index, curIndex, sum);
curIndex = *index.rbegin();
next = findNextIndex(curIndex);
}
index.size() > 1这句话先开始没有加上,导致了vector类型变量不断pop_back,直到报异常。
一组测试数据如下:
9
15 3 2 11 4 1 8 8 8
6
6 2 2 4 8 8
5
1 1 1 1 1
2
1 1
4
2 2 9 9
3
1 2 3
64
40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
40 40 43 42 42 41 10 4 40 40 40 40 40 40 40 40 40 40 40 40 40
40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
40
7
49 48 47 46 45 44 43
7
3 4 5 5 5 5 13
7
2 7 7 7 7 10 20
6
1 2 3 11 11 20
7
63 2 44 12 60 35 60
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
64
32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32
33 31 31 33
25
13 13 14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 19
19
4 4 4 4 4 4 4 4 4 9 9 9 9 9 9 11 11 11 12
64
40 40 30 35 35 26 15 40 40 40 40 40 40 40 40 40 40 40 40 40 40
40 40 43 42 42 41 10 4 40 40 40 40 40 40 40 40 40 40 40 40 40
40 25 39 46 40 10 4 40 40 37 18 17 16 15 40 40 40 40 40 40 40
40
45
15 3 2 11 4 1 8 8 8 15 3 2 11 4 1 8 8 8 15 3 2 11 4 1 8 8 8 15 3 2 11 4 1 8 8 8
15 3 2 11 4 1 8 8 8
0
输出为:
20
10
1
1
11
3
1251
322
20
30
24
276
6
5
64
20
27
454
20