校招全国统一模拟笔试2020年2月场编程题参考代码


变换次数

分析

暴力计算即可.

参考code

#include <bits/stdc++.h>

using namespace std;

int n, ans, tmp;
int main() {
    cin >> n;
    while(n > 9) {
        tmp = 1;
        for(; n; n /= 10) tmp *= n % 10;
        n = tmp;
        ans++;
    }
    cout << ans << endl;
}

神奇数

分析

枚举区间内的数,然后check一下要求的性质即可。

参考code

#include <bits/stdc++.h>

using namespace std;

bool isprime(int x) {
    for(int i = 2; i * i <= x; i++) {
        if(x % i == 0) return false;
    }
    return true;
}
bool check(int x) {
    int cnt[10];
    memset(cnt, 0, sizeof(cnt));
    while(x) {
        cnt[x % 10]++;
        x /= 10;
    }
    for(int i = 1; i < 10; i++) {
        for(int j = 1; j < 10; j++) {
            if(i != j && cnt[i] && cnt[j]) {
                if(isprime(i * 10 + j)) return true;
            }else if(i == j && cnt[i] >= 2) {
                if(isprime(i * 10 + j)) return true;
            }
        }
    }
    return false;
}
int main() {
    int a, b, ans = 0;;
    cin >> a >> b;
    for(int i = a; i <= b; i++) {
        if(check(i)) ans++;
    }
    cout << ans << endl;
    return 0;
}

添加字符

分析

分为A长度小于B的情况和等于的情况。
小于就枚举B串的一个偏移量,然后枚举维护最小的不相等的位数。
等于就直接对比就好了。

参考code

#include <bits/stdc++.h>

using namespace std;

int main() {
    string a, b;
    cin >> a >> b;
    int la = a.size(), lb = b.size();
    if(la < lb) {
        int ans = 1e9;
        for(int i = 0; i + la <= lb; i++) {
            int cnt = 0;
            for(int j = 0; j < la; j++) {
                if(a[j] != b[i + j]) cnt++;
            }
            if(cnt < ans) {
                ans = cnt;
            }
        }
        cout << ans << endl;
        return 0;
    } else {
        int cnt = 0;
        for(int j = 0; j < la; j++) {
            if(a[j] != b[j]) ++cnt;
        }
        cout << cnt << endl;
    }
    return 0;
}

数组变换

分析

对于每个数一直除2,然后最后check是否相等即可。

参考code

#include <bits/stdc++.h>

using namespace std;

int a[55];
int main() {
    int n;
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];
    string res = "YES";
    for(int i = 0; i < n; i++) {
        while(!(a[i] & 1)) a[i] >>= 1;
    }
    for(int i = 1; i < n; i++) {
        if(a[i] != a[0]) res = "NO";
    }
    cout << res << endl;
}

排序子序列

分析

考虑序列A_1, A_2, . . . , A_i是一个单调的序列.显然如果对于j < i把序列分为A_1, A_2. . . A_j 和 A_j+1, A_j+2, . . . , A_i 两个部分不会使问题变得更优.

于是我们可以贪心的去重复下面过程:
1、 从序列中找出最长的单调连续子序列
2、 删除找出的最长的单调连续子序列

这里的单调序列包括非递增和非递减,而判断子序列是否单调的时候,注意处理等于的情况。

参考code

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector <int> A;
    int ans = 1;
    for(int i = 0; i < n; ++i) {
        int x;
        cin >> x;
        if(A.size() <= 1)
            A.push_back(x);
        else {
            if(A[0] <= A.back() && A.back() <= x)
                A.push_back(x);
            else if(A[0] >= A.back() && A.back() >= x)
                A.push_back(x);
            else {
                ans++;
                A.clear();
                A.push_back(x);
            }
        }
    }
    cout << ans << endl;
    return 0;
}

组队竞赛

分析

对于所有参赛队员,我们把他们的水平值进行逆序排序,然后逐一挨着安排每个队伍,然后计算出队伍水平值总和,即为所求。对于a1 >= a_2 >= a_3... >= a{3N}, 我们可以容易观察出答案就是a2 + a_4 + a_6 +...+ a{2N}

参考code

#include <bits/stdc++.h>

using namespace std;

const int maxn = 300100;

int a[maxn];

int main() {
    int n; scanf("%d", &n);
    for(int i = 0; i < 3 * n; i++) scanf("%d", &a[i]);
    sort(a, a + 3 * n);
    long long ans = 0;
    for(int i = 0; i < n; i++) ans += a[n + 2 * i];
    printf("%lld\n", ans);
    return 0;
}

训练部队

分析

可以考虑把新兵分为两种类型。
一种战斗型(战斗值大于潜力值的),一种潜力型(相当于打了他可以获得潜力值),对潜力型的新兵进行战斗力值排序。
然后一种情况是潜力型中战斗值最高的牛牛去打完剩余的潜力型,因为战斗力值会越大越多,另一种情况考虑打完所有潜力型获得值是固定的,那么在攻击型中找一个能打完所有的潜力型的牛牛,并且战斗力值和潜力值要最大。
实现就是用的前缀和和二分

参考code

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const int maxn = 100005;
int n;
int goodn,badn;
LL sum[maxn],MAX[maxn];
struct Node {
    LL x,y;
    Node() {}
    Node (const LL &_x,const LL &_y) { x=_x; y=_y; }
    bool operator < (const Node &t) const {
        if(x ^ t.x) return x < t.x;
        return y < t.y;
    }
}good[maxn],bad[maxn];
int search(int L, int R, LL x) {
    while(L < R) {
        int mid = (L + R + 1) >> 1;
        if(MAX[mid] < x) L = mid;
        else R = mid - 1;
    }
    return L;
}
LL solve() {
    LL ans = 0;
    ans = max(ans, sum[search(0, goodn - 1, good[goodn].x)] + good[goodn].x + good[goodn].y);
    for(int i = 1; i <= badn; i++) {
        int pos = search(0, goodn, bad[i].x);
        ans = max(ans, sum[pos] + bad[i].x + bad[i].y);
    }
    return ans;
}
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        LL x, y;
        scanf("%lld%lld",&x, &y);
        if(x < y) good[++goodn] = Node(x,y);
        else bad[++badn] = Node(x,y);
    }
    sort(good + 1, good + goodn + 1);
    MAX[0] = 0; sum[0] = 0;
    for(int i = 1; i <= goodn; i++) {
        sum[i] = sum[i-1] + good[i].y - good[i].x;
        MAX[i] = max(MAX[i-1], good[i].x - sum[i-1]);
    }
    LL ans = solve();
    printf("%lld\n", ans);
    return 0;
}

牛牛的数列

分析

正着枚举记录一下当前位置的连续上升子序列长度,倒着也做一遍。
最后枚举一个连接点即可。

参考code

#include <bits/stdc++.h>

using namespace std;

const int maxn = 100000 + 5;
const int INF = 0x3f3f3f3f;

int a[maxn], n;
int pre[maxn], suf[maxn];
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", a + i);
    a[0] = INF, a[n + 1] = INF;
    for(int i = 1; i <= n; i++) pre[i] = a[i - 1] < a[i] ? pre[i - 1] + 1 : 1;
    for(int i = n; i >= 1; i--) suf[i] = a[i] < a[i + 1] ? suf[i + 1] + 1 : 1;
    int ans = 1;
    for(int i = 1; i <= n; i++) {
        ans = max(ans, pre[i - 1] + 1);
        ans = max(ans, suf[i + 1] + 1);
        if(a[i + 1] - a[i - 1] >= 2) ans = max(ans, pre[i - 1] + suf[i + 1] + 1);
    }
    printf("%d\n", ans);
    return 0;
}
#校招#
全部评论
一做题就发现我还是啥也不会啊
2 回复
分享
发布于 2020-02-27 21:26
三道题 90% 100% 90%....不知道是哪些地方出了点问题。。
2 回复
分享
发布于 2020-02-28 11:42
联易融
校招火热招聘中
官网直投
不是一套题
1 回复
分享
发布于 2020-02-27 21:05
题目不放一下吗
1 回复
分享
发布于 2020-02-27 21:29
组队卡60%了,原来是要long long啊,太久没刷题了……
1 回复
分享
发布于 2020-02-27 21:41
我就想知道这种题是什么厂的难度,我要回避一下
1 回复
分享
发布于 2020-02-27 22:06
这是哪家公司的啊。
1 回复
分享
发布于 2020-02-27 22:42
long long哭了
1 回复
分享
发布于 2020-02-28 11:41
刚刚进行的#互联网校招全国统一模拟笔试# 编程题参考代码,欢迎收藏~
点赞 回复
分享
发布于 2020-02-27 21:05
组队竟然是long long 哭辽
点赞 回复
分享
发布于 2020-02-28 02:02
排序子序列只能过80的用例是什么鬼?
点赞 回复
分享
发布于 2020-02-28 09:31
点赞 回复
分享
发布于 2020-02-28 13:21
我把上面没用longlong卡60的同仁挨个点赞。。😂
点赞 回复
分享
发布于 2020-02-28 14:13
有没有试卷下载一下
点赞 回复
分享
发布于 2020-03-02 16:24
排序子序列那题,子序列是连续的????按题解做法子序列是连续的,按道理来说子序列不应该不连续吗?
点赞 回复
分享
发布于 2020-03-17 19:10

相关推荐

6 33 评论
分享
牛客网
牛客企业服务