昨晚学妹参加了B站秋招笔试,还想考考我?

简介: 昨晚学妹参加了B站秋招笔试,还想考考我?

学妹昨晚参加了B站的2022届秋招算法笔试,做完给我发来了一道题,想考考我,说挺难的。

我看了两分钟,给她发去了我的思路。然后学妹一眼就看懂了,立马秒过。

那么这道题到底是怎么做的呢?

题目要求将个数切分成块,求每块的序号乘上该块内数字之和的最大值。

那么首先我们可以用来表示前缀和,也就是。

然后假设个子序列中,第个子序列的末尾元素为,其中。那么第个子序列的元素和就可以用前缀和来表示为。

然后题目要求的最大值就可以表示为:

展开并化简就可以得到:

后面一项就是整个数组之和的倍,是一个定值。所以要求这个式子的最大值,就是求的最小值。

又因为,所以就是求的最小值。

可以发现,这个前缀和其实是互不干扰的,所以只需要对所有的前缀和进行排序,取最小的个就行了。

C++代码如下:

#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 300010;
ll a[N];
int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; ++i) {
        scanf("%lld", &a[i]);
        if (i) a[i] += a[i-1];
    }
    sort(a, a+n-1);
    ll res = 0;
    for (int i = 0; i < k-1; ++i)
        res += a[i];
    res = -res + k * a[n-1];
    printf("%lld\n", res);
    return 0;
}

Python代码:

n, k = [int(x) for x in input().strip().split(" ")]
a = [int(x) for x in input().strip().split(" ")]
S = [sum(a[:i+1]) for i in range(n-1)]
S.sort()
res = -sum(S[:k-1]) + k * sum(a)
print(res)
相关文章
|
2月前
|
存储 C++
【寒假打卡】Day01
【寒假打卡】Day01
28 0
|
2月前
|
网络协议 算法 Java
从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多
老家农村,家里好不容易把我送到大城市读书,大学非985,211,但在我们老家,能出一个本科大学生也是非常不容易的。因为农村信息的相对闭塞,我对大学专业一无所知,加上分数并非前茅,最后被调剂一个我并不喜欢的专业,这里就不透露自己是什么学校了,只能说毕业之后为了能多赚点,选择了送外卖,这一送就送了将近3年的时间。
|
2月前
【寒假打卡】Day02
【寒假打卡】Day02
28 0
|
10月前
|
消息中间件 算法 NoSQL
秋招上岸“我”都做对了哪些事?
秋招上岸“我”都做对了哪些事?
93 2
秋招上岸“我”都做对了哪些事?
|
算法 Java 关系型数据库
圆梦腾讯之后,我收集整理了这份“2023春招常见面试真题汇总”
大家看我前几天的文章就能够知道,我在今年春招中成功拿到了腾讯Java工程师的Offer!在我拿到Offer之后,我就在想,能不能够把我和几个哥们这两个月面试过程中经常被问到的面试进行一个收集整理,能够帮助大家在面试的时候更加得心应手,也能少走一些弯路!
|
大数据 测试技术 程序员
【面试邀请】温大大和他的朋友们,日常都是怎么「摸鱼+加薪」的?
大家好,我是温大大 就像马丁·路德·金说过一句话:I have a dream 温大大也有个梦想就是: 1、将毕生所学的「测试技能」倾囊相授传给各位同学,让同学们升职加薪。 2、组建一个测试圈,在这里我们可以:讨论「测试」技术问题、揭秘「测试」薪酬、分享「面试」套路。
【面试邀请】温大大和他的朋友们,日常都是怎么「摸鱼+加薪」的?
|
消息中间件 NoSQL 算法
双非硕士的辛酸求职回忆录:第 1 篇 一份让面试官满意的简历究竟要做到什么
双非硕士的辛酸求职回忆录:第 1 篇 一份让面试官满意的简历究竟要做到什么
166 0
双非硕士的辛酸求职回忆录:第 1 篇 一份让面试官满意的简历究竟要做到什么