字节跳动2020校园招聘笔试题(2019.9.15)

和小于K的三元组个数

字节跳动2020校园招聘笔试题(2019.9.15)_第1张图片字节跳动2020校园招聘笔试题(2019.9.15)_第2张图片
图片来源于网络,侵删。

int main()
{
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; ++i)
        cin >> nums[i];

    int k;
    cin >> k;
    sort(nums.begin(), nums.end());

    int res = 0;
    for (int third = n - 1; third >= 2; --third) {
        int i = 0;
        int j = third - 1;
        while (i < j) {
            int cur = nums[i] + nums[j] + nums[third];
            if (cur < k) {
                res += j - i;
                ++i;
            }
            else
                --j;
        }
    }

    cout << res << endl;
}

文件传输

题目: 有n个要传输的文件堆,在第t时刻会将文件数量为m的文件堆加入队列,服务器每次只能传输一个文件,求解服务器将所有文件传输完需要的时间,以及队列中最大的文件数量。

#include
#include
#include
using namespace std;


int main()
{
    int n;
    cin >> n;
    vector<vector<int>> nums(n, vector<int>(2));
    for (int i = 0; i < n; ++i)
        cin >> nums[i][0] >> nums[i][1];

    sort(nums.begin(), nums.end());

    long t = 0;
    long res = 0;
    long cur = 0;

    for (int i = 0; i < n; ++i) {
        if (i == 0)
            t = nums[0][0];

        cur += nums[i][1];
        res = max(res, cur);
        if (i < n - 1) {
            while (t < nums[i+1][0]) {
                cur = cur > 0 ? cur - 1: 0;
                ++t;
            }
        }
        else {
            while (cur > 0) {
                --cur;
                ++t;
            }
        }
    }
    cout << t << " " << res << endl;

    return 0;
}

最大得分

LeetCode486. Predict the Winner

stone games

leetcode486是判断先选择的人是否能赢,稍微改动一下就好,dp[i][j]表示先选择的人能够多获得的分数,将结果转换得到先选择的人最多能获得的分数。

int main()
{
    int n;
    cin >> n;
    vector<int> nums(n);
    int sum = 0;
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
        sum += nums[i];
    }
    vector<vector<int>> dp(n, vector<int>(n));
    for (int i = 0; i < n; ++i)
        dp[i][i] = nums[i];

    for (int len = 1; len < n; ++len) {
        for (int i = 0; i + len < n; ++i) {
            int  j = i + len;
            dp[i][j] = max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]);
        }
    }

    int res = 0;
    res += (sum - dp[0][n - 1]) / 2 + dp[0][n - 1];
    cout << res << endl;
}

你可能感兴趣的:(笔试)