前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-06-15:薯队长最近在参加了一个活动,主办方提供了N个礼物以供挑选, 每个礼物有一个价值,范围在0 ~ 10^9之间, 薯队长可以从中挑选k个礼物。

2022-06-15:薯队长最近在参加了一个活动,主办方提供了N个礼物以供挑选, 每个礼物有一个价值,范围在0 ~ 10^9之间, 薯队长可以从中挑选k个礼物。

原创
作者头像
福大大架构师每日一题
发布2022-06-15 22:01:13
1740
发布2022-06-15 22:01:13
举报

2022-06-15:薯队长最近在参加了一个活动,主办方提供了N个礼物以供挑选, 每个礼物有一个价值,范围在0 ~ 10^9之间, 薯队长可以从中挑选k个礼物。 返回:其中价值最接近的两件礼物之间相差

100/100

发布文章

weixin_48502062

new

2022-06-15:薯队长最近在参加了一个活动,主办方提供了N个礼物以供挑选,

每个礼物有一个价值,范围在0 ~ 10^9之间,

薯队长可以从中挑选k个礼物。

返回:其中价值最接近的两件礼物之间相差值尽可能大的结果。

小红书第二题。

薯队长最近在玩一个游戏,这个游戏桌上会有一排不同颜色的方块,

每次薯队长可以选择一个方块,便可以消除这个方块以及和他左右相临的

若干的颜色相同的方块,而每次消除的方块越多,得分越高。

具体来说,桌上有以个方块排成一排 (1 <= N <= 200),

每个方块有一个颜色,用1~N之间的一个整数表示,相同的数宇代表相同的颜色,

每次消除的时候,会把连续的K个相同颜色的方块消除,并得到K*K的分数,

直到所有方块都消除。显然,不同的消除顺序得分不同,薯队长希望您能告诉他,这个游戏最多能得到多少分。

小红书第三题。

答案2022-06-15:

二分答案法。

代码用rust编写。代码如下:

代码语言:rust
复制
fn main() {
    let mut nums: Vec<i32> = vec![6, 19, 3, 8, 29];
    let ans = max_near(&mut nums, 3);
    println!("ans = {}", ans);
}

fn max_near(arr: &mut Vec<i32>, k: i32) -> i32 {
    if (arr.len() as i32) < k {
        return -1;
    }
    arr.sort();
    let n = arr.len() as i32;
    let mut l = 0;
    let mut r = arr[(n - 1) as usize] - arr[0];
    let mut m = 0;
    let mut ans = 0;
    while l <= r {
        m = (l + r) / 2;
        if yeah(arr, k, m) {
            ans = m;
            l = m + 1;
        } else {
            r = m - 1;
        }
    }
    return ans;
}

fn yeah(arr: &mut Vec<i32>, k: i32, limit: i32) -> bool {
    let mut last = arr[0];
    let mut pick = 1;
    for i in 1..arr.len() as i32 {
        if arr[i as usize] - last >= limit {
            pick += 1;
            last = arr[i as usize];
        }
    }
    return pick >= k;
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

2022-06-15:薯队长最近在参加了一个活动,主办方提供了N个礼物以供挑选,

每个礼物有一个价值,范围在0 ~ 10^9之间,

薯队长可以从中挑选k个礼物。

返回:其中价值最接近的两件礼物之间相差值尽可能大的结果。

小红书第二题。

薯队长最近在玩一个游戏,这个游戏桌上会有一排不同颜色的方块,

每次薯队长可以选择一个方块,便可以消除这个方块以及和他左右相临的

若干的颜色相同的方块,而每次消除的方块越多,得分越高。

具体来说,桌上有以个方块排成一排 (1 <= N <= 200),

每个方块有一个颜色,用1~N之间的一个整数表示,相同的数宇代表相同的颜色,

每次消除的时候,会把连续的K个相同颜色的方块消除,并得到K*K的分数,

直到所有方块都消除。显然,不同的消除顺序得分不同,薯队长希望您能告诉他,这个游戏最多能得到多少分。

小红书第三题。

答案2022-06-15:

二分答案法。

代码用rust编写。代码如下:

fn main() {

代码语言:txt
复制
let mut nums: Vec<i32> = vec![6, 19, 3, 8, 29];
代码语言:txt
复制
let ans = max_near(&mut nums, 3);
代码语言:txt
复制
println!("ans = {}", ans);

}

fn max_near(arr: &mut Vec<i32>, k: i32) -> i32 {

代码语言:txt
复制
if (arr.len() as i32) < k {
代码语言:txt
复制
    return -1;
代码语言:txt
复制
}
代码语言:txt
复制
arr.sort();
代码语言:txt
复制
let n = arr.len() as i32;
代码语言:txt
复制
let mut l = 0;
代码语言:txt
复制
let mut r = arr[(n - 1) as usize] - arr[0];
代码语言:txt
复制
let mut m = 0;
代码语言:txt
复制
let mut ans = 0;
代码语言:txt
复制
while l <= r {
代码语言:txt
复制
    m = (l + r) / 2;
代码语言:txt
复制
    if yeah(arr, k, m) {
代码语言:txt
复制
        ans = m;
代码语言:txt
复制
        l = m + 1;
代码语言:txt
复制
    } else {
代码语言:txt
复制
        r = m - 1;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
return ans;

}

fn yeah(arr: &mut Vec<i32>, k: i32, limit: i32) -> bool {

代码语言:txt
复制
let mut last = arr[0];
代码语言:txt
复制
let mut pick = 1;
代码语言:txt
复制
for i in 1..arr.len() as i32 {
代码语言:txt
复制
    if arr[i as usize] - last >= limit {
代码语言:txt
复制
        pick += 1;
代码语言:txt
复制
        last = arr[i as usize];
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
return pick >= k;

}

执行结果如下:

在这里插入图片描述

左神java代码

Markdown 已选中 1127 字数 71 行数 当前行 71, 当前列 126 HTML 918 字数 55 段落

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档