813 小红书笔试题解

中途加入只写了1,3,第二题没看懂要干啥
第一题:优先队列 + 贪心
可以想到贪心,先把所有的数给拆出来,比如[11, 299],拆成[9,9,2,1,1],然后贪心,把大的数放在位数高的那个元素就行了,比如例子中可以变成[(1,2), (2,3)]表示第一个数有两位,第二个数有三位,然后放入优先队列,首先取出第二个元素,将第三位变成9,现在第二个元素只剩两位了,继续放入优先队列,按照该顺序写就OK。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N] ,h[10];
pair<int, int> b[N];
int main() {
    int n;
    cin >> n;
    priority_queue<pair<int, int>> pq;
    for (int i = 0; i < n; i ++) {
        cin >> a[i];
        b[i].second = i;
        while (a[i]) {
            h[a[i] % 10] ++;
            a[i] /= 10;
            b[i].first ++;
        }
        pq.push(b[i]);
    }
    while(pq.size() > 0) {
        pair<int, int> t = pq.top();
        pq.pop();
        int num = 0;
        for (int i = 9; i >= 0; i --) {
            if (h[i] != 0) {
                h[i] --;
                num = i;
                break;
            }
        }
        a[t.second] = a[t.second] * 10 + num;
        t.first--;
        if (t.first !=0) {
            pq.push(t);
        }
    }
    long long res = 0;
    for (int i = 0; i < n; i ++) res += a[i];
    cout << res;
}

第三题:组合数
首先要推公式,如果两个数a[i]和a[j]之间有n个0,设z = a[j] - a[i], 有多少种可能的序列,设为f(z, n),C是组合数。
当n = 1 时,记为f(z, 1),很简单,该0可能是a[i] - a[j]之间的任何数,有z + 1 种可能,f(z, 1) = z + 1 = C(z+1, 1)。
当n = 2 时,固定第一个0,如果第一个0为x,那么第二个0就和n = 1 时一样,此时枚举第一个0从[0-z],
f(z, 2) = f(z,1) +f(z-1,1) + ...+f(1, 1) + f(0, 1) = 1 +... +z+1 = C(z+2, 2)。
同理, n=3时,同理枚举第一个0。
f(z, 3) = f(z, 2) +... f(0, 2) = C(z+2, 2) + C (z + 1, 2) + ... C(2, 2) = C(z+3, 3)

可以看出来f(z, n) = C(z + n, n) = (z +n)!/(n! & z!);
 #include <bits/stdc++.h>
using namespace std;
#define int long long
const int p = 1e9 + 7;
const int N = 6e5 + 10;
int a[N];
int mul[N], dmul[N];
int qs(int a, int b) {
    int res = 1;
    while (b) {
        if (b&1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}
int C(int n, int m) {
    int cc = 1;
    for (int i = n - m + 1; i <= n; i ++) cc = cc * i %p;
    return cc * dmul[m] % p;
}
int lucas(int n, int m) {
    if (m == 0) return 0;
    int a = n % p, b = m % p;
    if (b > a) return 0;
    return C(a, b) * lucas(n/p, m /p) % p;
}
signed main() {
    int n; cin >> n;
    vector<int> v;
    int res = 1;
    mul[0] = dmul[0] = 1;
    for (int i = 1 ; i < N ; i ++) {
        mul[i] = mul[i - 1] * i % p;
        dmul[i] = qs(mul[i], p - 2);
        
    }
    
    for (int i = 1 ;i <= n; i ++) cin >> a[i];
    for (int i = 1 ; i < n; ) {
        if (a[i] == 0) {
            int j = i;
            while (a[j] == 0) j++;
            int d = a[j] - a[i - 1];
            int z = j - i;
            res = res * C(z + d, z) % p;
            i = j;
        } else i++;
    }
    cout << res << '\n';
}

#笔试##小红书求职进展汇总##小红书#
全部评论

相关推荐

一天代码十万三:白面具还是太阴了,还得削
点赞 评论 收藏
分享
08-15 18:01
已编辑
美团_后端(实习员工)
bg学院本末9硕,6月18日在小红书上看到白袜哥宣传后私信,加入学习,当时项目有做黑马点评和外卖,算法刷了hot100,看了一些小林coding的八股,只是面试全挂了。但基础还行,只缺项目和补一下八股,所以学到7月初开始投,7月9日第一次面试美团,到8月1日前还面过快手、京东、字节、滴滴,但全都挂在了一面,答的很好也挂了。小红书本来hr都要约面了,又说有人已经接offer了所以流程中止,丢失面试机会。挫败感还是比较大的,都有点怀疑人生了,白袜哥跟我说是现在hc少,让再沉淀沉淀,但还是觉得很抑郁,明明都准备好了就是没过一面,找白袜哥聊,跟我讲了很多,现在印象比较深的就是他说暑期有合工大硕0实习一面放水,二面被拷打的完全答不出还是过,三面直接聊天躺赢进字节的故事,但还是觉得意难平,主要是在身边发生,一下有点接受不了。二战转折点在下午,面美团感觉相当好,问的所有问题都答出来了,但又有点担心跟之前一样面的好也挂,但这次并没有,面完半小时hr就打来了电话,问我什么可以到岗,有没有其他流程,如果给了offer会不会去,转折来的太突然让我反复怀疑真的面过了吗,即使白袜哥说这就是oc我还是持保留态度,只是把加了hr微信后的聊天记录发他确保沟通不踩雷,然后每隔一段时间刷新下状态翘首以盼。8月3日还出现了插曲,官网显示面试不通过,差点又道心破碎了,问白袜哥是什么情况,他的答复是美团校招官网经常出奇奇怪怪的bug,比如他暑期教的一个双9面美团时拿到的是那个人三年前本科投美团暑期的简历,但我还是怕变成一场空,就按他的意思去问hr,得到的回应是并没有挂,8月1日就已经推进了流程,只是要过周末,于是在忐忑不安中度过了周末。周一上午美团offer终于来了,悬着的心也是彻底放下。整个过程不是很长,但确实很提心吊胆,最后的offer也是一波三折,开始以为又会跟之前一样寄掉,知道要拿offer了开始高兴,看到官网面试未通过的崩溃,最后终于收到offer的释怀还是感谢下白袜哥在回答疑问之余还耐心的听我发牢骚,咏袜@黑皮白袜臭脚体育生8.15更新&nbsp;补聊天记录
学一下吧现在太菜了:刚面完美团,2道dp一道图论,都有原题,八股也是问一些简单的。面完一面就过了,完事之后美团领导就给发了offer,还给了一个头盔一套制服,不过领导说了,这年头电动车要自己买。
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务