2019-08-24田忌赛马问题JavaScript版

问题描述

两个小组A、B,每个小组有n个同学,已知每位同学的速度。两个小组进行赛跑获取积分,每次派出一名同学,胜者+1,败者-1,平局+0。问A组最多积多少分。
输入n代表n名同学
再输入n个数代表A组每人速度,又n个数代表B组每人速度。

解题思路

首先明确,A组可能赢,可能输,也可能平局!

1.先给两组数据排序 —— \color{red}{sort(sortby)方法}

我们需要从小到大排序。sort()方法默认是把数组的元素都转换成字符串(如有必要),按照字符编码的顺序进行排序。
而我们需要的是数值排序,故需要自己定义一个函数

  1. 确定策略:
    用贪心算法来实现
    (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]);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。