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

2020-04-29  本文已影响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


上一篇下一篇

猜你喜欢

热点阅读