42、淘汰分数---美团

 问题:

某比赛已经进入了淘汰赛阶段,已知共有n名选手参与了此阶段比赛,他们的得分分别是a_1,a_2….a_n,小美作为比赛的裁判希望设定一个分数线m,使得所有分数大于m的选手晋级,其他人淘汰。

但是为了保护粉丝脆弱的心脏,小美希望晋级和淘汰的人数均在[x,y]之间。

显然这个m有可能是不存在的,也有可能存在多个m,如果不存在,请你输出-1,如果存在多个,请你输出符合条件的最低的分数线。

输入描述:

输入第一行仅包含三个正整数n,x,y,分别表示参赛的人数和晋级淘汰人数区间。(1<=n<=50000,1<=x,y<=n)

输入第二行包含n个整数,中间用空格隔开,表示从1号选手到n号选手的成绩。(1<=|a_i|<=1000)

输出描述:

输出仅包含一个整数,如果不存在这样的m,则输出-1,否则输出符合条件的最小的值。

输入例子1:

6 2 3
1 2 3 4 5 6

输出例子1:

3

 编译未通过:输入输出的问题

// 即 值大于m的选手晋级,小于等于的淘汰
// 晋级和淘汰的人数在区间[x,y]
//思路: 在分数区间内,寻找m,并统计晋级和淘汰的人数,若此时的m满足晋级和淘汰的人数在区间[x,y],则输出m(从小到大查找)
let n=0,x=0,y=0,score=[];
let line = readline();
let str = line.split(" ");
    n = str[0]-"0";
    x = str[1]-"0";
    y = str[2]-"0";
readline().split(" ").forEach(item => score.push(item-"0"));

function getRes(n,x,y,score){
    if(n===1) return -1; //只有一个人
    //1)排序
    score.sort();
    let m=-1;
    for(let i=0;i<n;i++){
        if((i+1)>=x && (i+1)<=y && (n-i-1)>=x && (n-i-1)<=y){
            return score[i]
        }
    }
    return -1;
}
console.log(getRes(n,x,y,score))
//console.log(getRes(6,2,3,[1,2,3,4,5,6]))

编译通过的版本:

const readline = require('readline')
const rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout
})
let lineData = []
rl.on('line',line=>{
    lineData.push(line.trim())
    if(lineData.length===2){
        //处理第一行输入,得到参加人数,淘汰人数区间
        let arr1 = lineData[0].split(' ').map(e=>+e)
        let n = arr1[0],x=arr1[1],y=arr1[2]
        //处理第二行输入,得到分数数组
        let arr2 = lineData[1].split(' ').map(e=>+e)
        //分数排序
        arr2.sort((a,b)=>a-b)
        let flag = 0
        let index = Array.from({length:y-x+1},(e,i)=>x+i*1)
        for(const i of index){
            if(arr2[i]!=arr2[i-1] && arr2.length-i<=y){
                flag=1
                console.log(arr2[i-1])
                break
            }
        }
        if(flag===0){
            console.log(-1)
        }
    }
})

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LRU(Least Recently Used)是一种常见的缓存淘汰算法,它的基本思想是:将最不常用的数据最先淘汰掉。 具体实现方式通常是将缓存空间划分为若干个桶(bucket),每个桶中存储一组数据,同时记录它们最后一次被访问的时间。当缓存空间满了,需要淘汰一些数据时,LRU算法会根据数据最近使用的频率和时间进行淘汰。 算法的核心思想是通过计数器(例如最近访问计数器)和哈希表(或排序列表)来实现。计数器用于记录每个数据项最后一次被访问的时间,哈希表或排序列表用于快速查找和删除数据项。 具体实现步骤如下: 1. 当缓存空间满了,需要淘汰一些数据时,遍历缓存中的所有数据项,并记录它们最后一次被访问的时间。 2. 根据时间戳和计数器的值,将数据项按照最近使用的频率进行排序。 3. 将排最靠后的数据项从缓存中删除,并释放相应的空间。 4. 如果需要继续淘汰数据,重复步骤1-3,直到缓存空间不再满为止。 这种算法的优点是实现简单,易于理解和实现,并且具有较好的性能和效率。但是,它也有一些缺点,例如当缓存命中率较低时,需要频繁地进行淘汰和替换操作,导致缓存命中率进一步下降。此外,如果需要支持高并发访问,还需要考虑并发控制和线程安全等问题。 总之,LRU算法是一种常用的缓存淘汰算法,适用于需要快速响应和低延迟的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值