首页 > 20200906 腾讯秋招笔试 5题题解
头像
三更未眠
编辑于 2020-09-06 22:32
+ 关注

20200906 腾讯秋招笔试 5题题解


第一题(100%)

维护前缀递减、后缀递增数组。
#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
const long long infl = 0x3f3f3f3f3f3f3f3fll;

const int MAXN = 1005;
int T, n, A[MAXN];
int pre[MAXN], suf[MAXN];

int main() {
#ifdef __LOCAL_WONZY__
    freopen("input-1.txt", "r", stdin);
#endif  // __LOCAL_WONZY__
    cin >> T;
    while (T--) {
        cin >> n;
        for (int i = 1; i <= n; ++i) cin >> A[i];
        for (int i = 1; i <= n; ++i) {
            pre[i] = 1;
            for (int j = 1; j < i; ++j) {
                if (A[j] > A[i]) pre[i] = max(pre[j] + 1, pre[i]);
            }
        }
        for (int i = n; i >= 1; --i) {
            suf[i] = 1;
            for (int j = i + 1; j <= n; ++j) {
                if (A[i] < A[j]) suf[i] = max(suf[j] + 1, suf[i]);
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = i + 1; j <= n; ++j) {
                if (A[i] == A[j]) {
                    ans = max(ans, 2 * min(pre[i], suf[j]));
                }
            }
        }
        cout << ans << endl;
    }
    return 0;
}

第二题(100%)

暴力枚举答案。
#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
const long long infl = 0x3f3f3f3f3f3f3f3fll;

const int MAXN = 10;
int n, A[MAXN];

int main() {
#ifdef __LOCAL_WONZY__
    freopen("input-2.txt", "r", stdin);
#endif  // __LOCAL_WONZY__
    while (cin >> n) {
        for (int i = n; i >= 0; --i) cin >> A[i];
        const double infd = 100;
        vector<int> ans;
        for (double x = -infd; x < infd; x += 0.01) {
            double val_1 = 0;
            for (int i = 0; i <= n; ++i) {
                val_1 += A[i] * pow(x - 0.005, i);
            }
            double val_2 = 0;
            for (int i = 0; i <= n; ++i) {
                val_2 += A[i] * pow(x + 0.005, i);
            }
            double val = 0;
            for (int i = 0; i <= n; ++i) {
                val += A[i] * pow(x, i);
            }
            if (val_1 * val_2 < 0 || fabs(val) < 1e-6) {
                ans.push_back(round(x * 100));
            }
        }
        sort(ans.begin(), ans.end());
        ans.erase(unique(ans.begin(), ans.end()), ans.end());
        if (ans.empty())
            cout << "No" << endl;
        else {
            for (int i = 0; i < ans.size(); ++i) {
                cout << fixed << setprecision(2) << ans[i] / 100.;
                if (i == ans.size() - 1)
                    cout << endl;
                else
                    cout << " ";
            }
        }
    }
    return 0;
}

第三题(100%)

暴力模拟,调调随机数,调调模拟次数,就 ac 了。当然也可以求公式。
#include <bits/stdc++.h>
using namespace std;

const long long infl = 0x3f3f3f3f3f3f3f3fll;
double randf(double minv, double maxv) { return minv + rand() / double(RAND_MAX / (maxv - minv)); }

int mock(double L, const double& d) {
    if (L <= d) return 0;
    double le = randf(0, L);
    return mock(L - le, d) + 1;
}

int main() {
#ifdef __LOCAL_WONZY__
    freopen("input-3.txt", "r", stdin);
#endif  // __LOCAL_WONZY__
    int L, d;
    while (cin >> L >> d) {
        vector<int> cnt;
        for (int _ = 0; _ < 25000000; ++_) {
            cnt.push_back(mock(L, d));
        }
        double ans = accumulate(cnt.begin(), cnt.end(), 0);
        ans /= cnt.size();
        cout << fixed << setprecision(4) << ans << endl;
    }
    return 0;
}

第四题(100%)

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

const int inf = 0x3f3f3f3f;
const long long infl = 0x3f3f3f3f3f3f3f3fll;
const unsigned long long base = 23333;
const int MAXN = 100005;

int T, n, A[MAXN][6];

unsigned long long hash_func(int ar[]) {
    unsigned long long ret = 0;
    for (int i = 0; i < 6; ++i) {
        ret = ret * base + ar[i];
    }
    return ret;
}

int main() {
#ifdef __LOCAL_WONZY__
    freopen("input-4.txt", "r", stdin);
#endif  // __LOCAL_WONZY__
    cin >> T;
    while (T--) {
        cin >> n;
        unordered_set<unsigned long long> st;
        bool suc = false;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < 6; ++j) {
                scanf("%d", &A[i][j]);
            }
            if (suc) continue;
            sort(A[i], A[i] + 6);
            unsigned long long hash_val = hash_func(A[i]);
            suc |= st.find(hash_val) != st.end();
            st.insert(hash_val);
        }
        cout << (suc ? "YES" : "NO") << endl;
    }
    return 0;
}

第五题(100%)

Dijkstra 求一个两次最短路
#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
const long long infl = 0x3f3f3f3f3f3f3f3fll;

const int MAXN = 2005;
const int MAXE = 1e5 + 5;

int T, N, M;
struct Edge {
    int v, next, w;
    Edge() {}
    Edge(int v, int next, int w) : v(v), next(next), w(w) {}
} edge[MAXE];
int ESZ, head[MAXN];
void init() {
    ESZ = 0;
    memset(head, -1, sizeof(head));
}
void add_edge(int u, int v, int w) {
    edge[ESZ] = Edge(v, head[u], w);
    head[u] = ESZ ++;
}
struct Dij {
    struct QNode {
        int u, cost;
        QNode() {}
        QNode(int u, int cost) : u(u), cost(cost) {}
        bool operator > (const QNode& e) const {
            return cost > e.cost;
        }
    } cur;
    priority_queue<QNode, vector<QNode>, greater<QNode> > Q;
    long long cost[MAXN];
    bool vis[MAXN];
    void init() {
        while(!Q.empty()) Q.pop();
        memset(vis, false, sizeof(vis));
        memset(cost, 0x3f, sizeof(cost));
    }
    long long run(int src, int dst) {
        int u, v, w;
        Q.push(QNode(src, cost[src] = 0));
        while(!Q.empty()) {
            cur = Q.top();
            Q.pop();
            u = cur.u;
            if(vis[u]) continue;
            vis[u] = true;
            for(int i = head[u]; ~i; i = edge[i].next)  {
                v = edge[i].v, w = edge[i].w;
                if(!vis[v] && cost[v] > cost[u] + w) {
                    Q.push(QNode(v, cost[v] = w + cost[u]));
                }
            }
        }
        return cost[dst];
    }
} dij;

int main() {
#ifdef __LOCAL_WONZY__
    freopen("input-5.txt", "r", stdin);
#endif  // __LOCAL_WONZY__
    while(cin >> N >> M >> T) {
        init();
        for(int i = 1; i <= M; ++i) {
            int u, v, w;
            cin >> u >> v >> w;
            add_edge(u, v, w);
        }
        dij.init();
        long long ans = dij.run(1, N);
        dij.init();
        ans += dij.run(N, 1);
        cout << ans * T << endl;
    }
    return 0;
}


全部评论

(2) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐