上一篇博文中给出了子问题的解决算法。这里给出完整题目和代码。
题目就贴截图好了:
var readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal:false
});
var n = -1;// 初始状态为负数,表示还没开始读取
var res = 0;
rl.on('line', function(line){ // javascript每行数据的回调接口
if (n < 0) { // 测试用例第一行读取n
n = parseInt(line.trim())
} else {
var tokens = line.split(' ').map(function (x) {
return parseInt(x);
});
var arr=tokens.sort(sortNumber); //将数列从小到大排序
var hm=arr.slice(n); //获取[n+1,3n]顺序区间内的数列
catalanSort(hm,[],[],0);
console.log(res);
}
});
function sortNumber(a,b) {
return a-b
}
function catalanSort(arr,firstLine,secondLine,i){ //firstLine存储各分组的中位数
var n=arr.length/2;
if(firstLine.length==n) { //搜索到叶子节点,得到一组符合条件的中位数
res=getSum(firstLine)>res?getSum(firstLine):res; //判断该组中位数之和是否最大
}
else {
for (var j = 0; j < 2; j++) {
if (j == 0) {
firstLine.push(arr[i]);
} else {
secondLine.push(arr[i]);
}
if (firstLine.length >= secondLine.length) { //约束条件判断
catalanSort(arr,firstLine,secondLine,i+1); //符合条件,扩展搜索空间
}
//回溯前,清楚上一步占用的空间状态
if(j==0){
firstLine.pop();
}else{
secondLine.pop();
}
}
}
}
function getSum(arr){ //计算数组中所有项之和
return arr.reduce(function(x,y){
return parseInt(x)+parseInt(y);
});
}