网易2019校招笔试编程题参考代码

表达式求值

思路

考虑所有可能的表达式取最大值。

时间复杂度

O(1)

参考代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    int ans = a + b + c;
    ans = max(ans, (a + b) * c);
    ans = max(ans, a + b * c);
    ans = max(ans, a * b + c);
    ans = max(ans, a * (b + c));
    ans = max(ans, a * b * c);
    cout << ans << endl;
    return 0;
}

俄罗斯方块

思路

用数组来模拟即可

时间复杂度

O(n)

参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n, 0);
    while (m--) {
        int c;
        cin >> c;
        a[--c]++;
    }
    cout << *min_element(a.begin(), a.end()) << endl;
    return 0;
}

丰收

思路

维护前缀和数组之后,二分查找答案。

时间复杂度

O(m*logn)

参考代码

#include <bits/stdc++.h>

using namespace std;

int sum[100005];

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        int a;
        scanf("%d", &a);
        sum[i] = sum[i - 1] + a;
    }
    int q;
    scanf("%d", &q);
    while (q--) {
        int d;
        scanf("%d", &d);
        int pos = lower_bound(sum, sum + n + 1, d) - sum;
        printf("%d\n", pos);
    }
    return 0;
}

思路

贪心。每次从最高的塔拿一块放到最低的塔上。

讲道理的话应该spj吧。。。

时间复杂度

O(k*logn)

参考代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main() {
    int n, k, m = 0;
    cin >> n >> k;
    set<pair<int, int> > s;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        s.emplace(x, i);
    }
    vector<pair<int, int> > v;
    while (k && s.size() > 1 && s.rbegin()->first - s.begin()->first > 1) {
        auto a = *s.begin(), b = *s.rbegin();
        s.erase(a), s.erase(b);
        k--;
        a.first++;
        b.first--;
        s.insert(a);
        s.insert(b);
        v.emplace_back(b.second, a.second);
    }
    cout << s.rbegin()->first - s.begin()->first << " " << v.size() << endl;
    for (auto p : v) cout << p.first << " " << p.second << endl;
    return 0;
}

瞌睡

思路

以长度为k的滑动窗口做个dp

时间复杂度

O(n)

参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n), t(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int now = 0;
    for (int i = 0; i < n; i++)
        cin >> t[i], now += t[i] * a[i];
    int res = now;
    for (int i = 0; i < n;) {
        now += (!t[i]) * a[i];
        if (++i >= k) {
            res = max(res, now);
            now -= (!t[i - k]) * a[i - k];
        }
    }
    cout << res << endl;
    return 0;
}

整理房间

思路

暴力枚举每团杂物4 ^ 4次旋转

时间复杂度

O(256*n)

参考代码

#include <bits/stdc++.h>
using namespace std;

struct point {
    int x, y;
    point(int x = 0, int y = 0) : x(x), y(y) {}
    point operator+(const point &rhs) const {
        return point(x + rhs.x, y + rhs.y);
    }
    point operator-(const point &rhs) const {
        return point(x - rhs.x, y - rhs.y);
    }
    point rotate() { return point(-y, x); }
    point rotate(const point &o) const { return o + (*this - o).rotate(); }
    bool operator==(const point &rhs) const { return x == rhs.x && y == rhs.y; }
};

bool check(const point &a, const point &b) {
    if (a.x == 0 && a.y == 0 || b.x == 0 && b.y == 0) return false;
    if (a.x * a.x + a.y * a.y != b.x * b.x + b.y * b.y) return false;
    if (a.x * b.x + a.y * b.y != 0) return false;
    return true;
}

int main() {
    int n;
    cin >> n;
    while (n--) {
        point p[4], o[4], a[4];
        for (int i = 0; i < 4; i++)
            scanf("%d %d %d %d", &p[i].x, &p[i].y, &o[i].x, &o[i].y);
        int res = -1;
        int x, y, z, w;
        for (x = 0, a[0] = p[0]; x < 4; x++) {
            for (y = 0, a[1] = p[1]; y < 4; y++) {
                for (z = 0, a[2] = p[2]; z < 4; z++) {
                    for (w = 0, a[3] = p[3]; w < 4; w++) {
                        int cost = x + y + z + w;
                        if (a[0] + a[1] == a[2] + a[3] &&
                                check(a[0] - a[1], a[2] - a[3]) ||
                            a[0] + a[2] == a[1] + a[3] &&
                                check(a[0] - a[2], a[1] - a[3]) ||
                            a[0] + a[3] == a[1] + a[2] &&
                                check(a[0] - a[3], a[1] - a[2])) {
                            if (res == -1 || res > cost) res = cost;
                        }
                        a[3] = a[3].rotate(o[3]);
                    }
                    a[2] = a[2].rotate(o[2]);
                }
                a[1] = a[1].rotate(o[1]);
            }
            a[0] = a[0].rotate(o[0]);
        }
        printf("%d\n", res);
    }
    return 0;
}

小易的字典

思路

贪心。从前往后,对于当前位置是'a'还是'z'可以计算出来。

还是有其他高级一点的做法的(雾

时间复杂度

O(n^2)

参考代码

#include <bits/stdc++.h>

using namespace std; 

int check(int a, int b, long long lim){ 
    long long ret = 1;
    if(b * 2 > a) b = a - b; 
    for(int i = 0; i < b; i++) { 
        ret *= (a - i);
        ret /= (i + 1);
        if(ret >= lim) return -1; 
    } 
    if(ret >= lim) return -1; 
    return (int)ret; 
} 
string solve(int a, int z, int k){ 
    string out = "";
    int n = a + z, i, s; 
    s = check(a + z, a, (long long)k);
    if(s != -1) return out; 
    for(int i = 0; i < n; i++){ 
        if(a == 0 || z == 0) break; 
        s = check(a - 1 + z, a - 1, (long long)k); 
        if(s == -1){ 
            out += 'a';
            a--; 
        } else { 
            k -= s;
            out += 'z';
            z--; 
        } 
    } 
    for(int i = 0; i < a; i++) out += 'a';
    for(int i = 0; i < z; i++) out += 'z'; 
    return out; 
} 
int main() {
    int n, m, k;
    cin >> n >> m >> k;
    string ans = solve(n, m, k);
    if(ans.size() == 0) cout << -1 << endl;
    else cout << ans << endl;
    return 0;
}
#网易##校招##笔试题目##题解#
全部评论
一首凉凉送给自己
点赞 回复
分享
发布于 2018-08-11 17:15
塔那一道题,这样解合理吗?你这样操作的话,很容易出现最后几次挪动并不会降低最高塔与最小塔之间的差值,比如 塔的高度是 3,3,3,4,4,4,5,5,5;k=2,挪动前是2 ,按照你的解法 挪动后是44344445,这样差值并没有小呀。
点赞 回复
分享
发布于 2018-08-11 17:42
滴滴
校招火热招聘中
官网直投
膜拜大佬,塔那道题思路是一样的,本地测试可以通过,但是线上直接0%,gg凉凉
点赞 回复
分享
发布于 2018-08-11 17:19
给楼主征集男朋友
点赞 回复
分享
发布于 2018-08-11 17:21
第一题苹果堆,第二题塔,第三题拼正方形。一直卡在塔那,换了两种输出顺序,一直20%,心态崩了,还是太菜
点赞 回复
分享
发布于 2018-08-11 17:27
这代码应该不是一个人写的,不同题的代码风格差别有点大。
点赞 回复
分享
发布于 2018-08-11 20:51
塔那一题 有没有谁能解答一下为什么通过为0……本地一点问题没有啊 思路也是最高的移动到最低的。 #include <stdio.h> int main() { int n, k, i, j, s, m, minIndex, maxIndex, minHeight, maxHeight; int arr[100]; int opArr[2000]; while(scanf("%d %d", &n, &k) != EOF) { int l = 0; for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } for (i = 0; i < k; i++) { minIndex = 0; minHeight = arr[0]; maxIndex = 0; maxHeight = arr[0]; for (j = 0; j < n; j++) { if (arr[j] > maxHeight) { maxHeight = arr[j]; maxIndex = j; } if (arr[j] < minHeight) { minHeight = arr[j]; minIndex = j; } } if (maxHeight - minHeight < 2) { break; } else { arr[maxIndex] -= 1; arr[minIndex] += 1; maxHeight -= 1; minHeight += 1; opArr[l] = maxIndex + 1; opArr[l+1] = minIndex + 1; l += 2; } } s = maxHeight - minHeight; m = i; printf("%d %d\n", s, m); l = 0; for (i = 0; i < m; i++) { printf("%d %d\n",opArr[l], opArr[l+1]); l += 2; } } return 0; }
点赞 回复
分享
发布于 2018-08-11 17:21
塔那题。。。思路很简单,为啥一直20% 搞不懂。
点赞 回复
分享
发布于 2018-08-11 17:23
调了40+min的塔,思路一模一样。。。一直20%。。。。
点赞 回复
分享
发布于 2018-08-11 17:31
看来大部分人都是制作出来一个啊
点赞 回复
分享
发布于 2018-08-11 17:35
塔那题一直20%,看了n遍题目。。赛后想到没有考虑到两座小塔合并成一座大塔,结果原来还是贪心,只是没有判spj?那不是神坑么😂
点赞 回复
分享
发布于 2018-08-11 17:48
👳
点赞 回复
分享
发布于 2018-08-11 17:16
前面给楼主蒸女盆友
点赞 回复
分享
发布于 2018-08-11 17:16
每次网易笔试后就等着大神的答案
点赞 回复
分享
发布于 2018-08-11 17:16
66666
点赞 回复
分享
发布于 2018-08-11 17:17
大佬是真的厉害
点赞 回复
分享
发布于 2018-08-11 17:21
给大佬跪了
点赞 回复
分享
发布于 2018-08-11 17:24
大佬这是自己写的还是    ....   官方?
点赞 回复
分享
发布于 2018-08-11 17:25
请问有完整的题目描述么?
点赞 回复
分享
发布于 2018-08-11 17:26
求丰收那题二分搜索的详细代码~
点赞 回复
分享
发布于 2018-08-11 17:27

相关推荐

点赞 评论 收藏
转发
点赞 227 评论
分享
牛客网
牛客企业服务