问题描述
两个小组A、B,每个小组有n个同学,已知每位同学的速度。两个小组进行赛跑获取积分,每次派出一名同学,胜者+1,败者-1,平局+0。问A组最多积多少分。
输入n代表n名同学
再输入n个数代表A组每人速度,又n个数代表B组每人速度。
解题思路
首先明确,A组可能赢,可能输,也可能平局!
1.先给两组数据排序 ——
我们需要从小到大排序。sort()方法默认是把数组的元素都转换成字符串(如有必要),按照字符编码的顺序进行排序。
而我们需要的是数值排序,故需要自己定义一个函数
- 确定策略:
用贪心算法来实现
(1)A组最后一个 > B组最后一个:让他俩比赛,A组积分+1
(2)A组最前一个 > B组最前一个:让他俩比赛,A组积分+1
(3)其他情况:让A组最前一个与B组最后一个比
a. 若相等 则 平局
b. A组最前一个 < B组最后一个:让他俩比赛,A组积分-1
c. A组最前一个 > B组最后一个:不会进入到这种情况!
3.答案:
var score = 0;
function race(n, arr_A, arr_B){
strategy(arr_A, arr_B)
console.log("分数:", score);
}
function strategy(arr_A, arr_B){
var n = arr_A.length;
if(n === 0){
return;
}
arr_A.sort(sortNumber);
arr_B.sort(sortNumber);
if(arr_A[n] > arr_B[n]){
arr_A.pop();
arr_B.pop();
score ++;
} else if(arr_A[0] > arr_B[0]){
arr_A.shift();
arr_B.shift();
score ++;
} else {
if(arr_A[0] != arr_B[n]){
score--;
}
arr_A.shift();
arr_B.pop();
}
strategy(arr_A,arr_B);
}
function sortNumber(a,b){
return a - b
}
race(3,[12,34,12],[45,1,90]);