首页 > 20200903百度秋招笔试(3编程题+20选择题)
头像
joshua0509
编辑于 2020-09-04 12:58
+ 关注

20200903百度秋招笔试(3编程题+20选择题)

笔试总时间2h,15单选 + 5不定选 花了40分钟!!!剩余80分钟做3道编程题,对于基础不好的我太难了!
选择题不用说了,每道题目都是正儿八经的专业题,基础好点的就没啥问题,然鹅我的基础不好!平衡二叉树忘记了!!!

编程题:
第一题:AC 赤裸裸的差分,线段树也可以,但是差分比较简单,
思路:比较简单吧,直接贴代码吧!
代码:
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1010;
int a[maxn];
int b[maxn];

int main(void)
{
#ifndef ONLINE_JUDGE
    freopen("a.txt", "r", stdin);
#endif

    int t;
    cin >> t;
    while(t--) {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));

        int len, n;
        cin >> len >> n;
        for(int i = 1; i <= n; ++i) {
            int l, r;
            cin >> l >> r;
            b[l]++;
            b[r+1]--;
        }
        for(int i = 1; i <= len; ++i) a[i] = a[i-1] + b[i];
        for(int i = 1; i <= len; ++i) {
            if(i < len) cout << a[i] << " ";
            else cout << a[i] << endl;
        }
    }
    return 0;
}

第二题:AC 每个人选一个满足自己角色值以上的,求最大总数量的人被提名为候选前提下的每个人的选择情况,不能选择就为-1
思路:看到数据量n <= 1000, n^2可以直接贪心,每个人按照val递增排序,每个觉得也按val递增排序,然后从最小的那个val开始寻找,找到第一个满足就跳出。下一个继续!
代码:
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
#define pii pair<int, int>
#define pll pair<ll, ll>
#define mp make_pair
#define ios ios::sync_with_stdio(false),cin.tie(0);

const int maxn = 1010;
pii a[maxn];
pii b[maxn];
int ans[maxn];

int main(void)
{
#ifndef ONLINE_JUDGE
    freopen("b.txt", "r", stdin);
#endif
    auto de = [](const pii& l, const pii& r){return l.second > r.second;};
    auto en = [](const pii& l, const pii& r){return l.second < r.second;};

    int t;
    cin >> t;
    while(t--) {
        int n, m, val;
        cin >> n >> m;
        for(int i = 1; i <= n; ++i) {cin >> val; a[i] = {i, val};}
        for(int i = 1; i <= m; ++i) {cin >> val; b[i] = {i, val};}
        sort(a + 1, a + n + 1, en);
        sort(b + 1, b + m + 1, en);
        memset(ans, -1, sizeof(ans));

        for(int i = 1; i <= n; ++i) {
            int idx = -1;
            for(int j = 1; j <= m; ++j) {
                if(b[j].second == -1 || b[j].second < a[i].second) continue;
                idx = j;
                b[j].second = -1;
                break;
            }
            if(idx == -1) break;
            ans[a[i].first] = b[idx].first;
         }
         for(int i = 1; i <= n; ++i) {
             if(i < n) cout << ans[i] << " ";
             else cout << ans[i] << endl;
         }
    }
    return 0;
}

第三题:
思路:
我的思路是:每一步都几下怎么走到下一步的。用一个状态记录f[i][j], 表示走j步到i的数量,枚举1 - m的步数状态,
然后要注意不能和前两步一样,因为记录了状态,直接排除相等的j就行,时间太短了,最后没有写完就到时间了!
对于动态规划的转移方程还不是很娴熟。继续学习吧!希望路过的大佬回复下你们的思路。学习!
代码:(后续参照别人的思路写出来的)
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
#define ios ios::sync_with_stdio(false),cin.tie(0);

const int maxn = 100005;
const int MOD = 1e9 + 7;
int f[maxn][8][8];

ll dfs(int n, int m, int pre1, int pre2) {
    if(n <= 0) {
        return (n == 0) ? 1 : 0;
    }
    if(f[n][pre1][pre2]) return f[n][pre1][pre2];
    ll cnt = 0;
    for(int i = 1; i <= m; ++i) {
        if(i == pre1 || i == pre2) continue;
        cnt += dfs(n-i, m, i, pre1);
    }
    f[n][pre1][pre2] = cnt % MOD;
    return f[n][pre1][pre2];
}

int main(void)
{
#ifndef ONLINE_JUDGE
    freopen("c.txt", "r", stdin);
#endif

    int n, m;
    while(cin >> n >> m) {
        memset(f, 0, sizeof(f));
        cout << dfs(n, m, 0, 0) << endl;
    }
    return 0;
}



全部评论

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

相关热帖

近期热帖

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

近期精华帖

热门推荐