美文网首页
设计一套方案得到最少的奖金

设计一套方案得到最少的奖金

作者: 收纳哥斯拉 | 来源:发表于2020-04-29 11:03 被阅读0次

    10个人参加比赛,最少都可以获得1w的奖金,颁奖的时候,10人随机排开,名次好的人得到的奖金要高于相邻的名次不好的人,大家才会觉得公平满意。计算至少发多少奖金。
    例如:

    第一人 名次4
    第二人 名次3
    第三人 名次5
    那么配发奖金:
    第一人 1w
    第二人 2w
    第三人 1w
    就可以满足。

    思路:

    image.png
    模拟人脑的思路,我需要找到最低成绩的位置,设置它为1,在找到成绩第二低的位置设置它为1,如果第二低和第一低相邻,要给第二低加1。
    示例,
    step1,成绩的数组(从左开始):array=[4, 2, 3, 5, 9, 10, 1, 7, 6, 8]
    step2,根据成绩从低到高对索引进行排序(例如7号成绩最低第一位,2号第二低...):
    index=[7, 2, 3, 1, 4, 9, 8, 10 , 5, 6]
    step3,根据index写出每个人分配钱的方案,从index找到定位,判断之前临近的左右位置有没有赋过值,有值需要+1,判断好了填写到对应人头的位置上,得到数组bonus=[2, 1, 2, 3, 4, 5, 1, 2, 1, 2] (1号2w块钱,2号1w块钱 ...)
    function countSmallestAmount(array) {
      //b=bonus array最开始全是0  
      let b = new Array(10).fill(0);
      //s=sorted index array根据array大小进行排序后的索引
      let s = Object.keys(array.slice()).sort((a, b) => array[a] - array[b]);
     
      for (let i = 0; i < s.length; i++) {
        //_s当前标,_l左标,_r右标
        let _s = parseInt(s[i]);
        let _r = _s + 1 > 9 ? 9 : _s + 1;//右边界
        let _l = s[i] - 1 < 0 ? 0 : s[i] - 1;//左边界
        //比较左右,在最大值基础上+1
        b[_s] = Math.max(b[_r], b[_l]) + 1;
      }
      //求和
      return b.reduce((a, b) => a + b);
    }
    
    let array = [4, 2, 3, 5, 9, 10, 1, 7, 6, 8];
    console.log(countSmallestAmount(array));
    //23
    
    
    

    相关文章

      网友评论

          本文标题:设计一套方案得到最少的奖金

          本文链接:https://www.haomeiwen.com/subject/nxqiwhtx.html