秋招笔试题专栏——模拟题

53 阅读2分钟

1. 换座位

题目

在线测评 image.png

代码

#include <bits/stdc++.h>

using namespace std;

int n, m, a;

int main() {
    cin >> n >> m >> a;
    vector<vector<string>> v(n, vector<string>(m, string()));
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            cin >> v[i][j];
        }
    }
    int count = 0;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            int r = (i == n-1) ? 0 : i + 1;
            int c = (j == m-1) ? 0 : j + 1;
            for(int k = 0; k < a; k++) {
                if(v[i][j][k] != v[r][c][k]) count++;
            }
        }
    }
    cout << count << endl;
}

注意点

  • 注意下标不要搞错,需要处理边界情况

2. 申请奖学金

题目

image.png

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin >> t;
    for(int i = 0; i < t; i++) {
        int n, x;
        bool flag = false;
        double res = 0;
        int w = 0;
        cin >> n >> x;
        vector<int> v1(n, 0);
        vector<int> v2(n, 0);
        for(int i = 0; i < n; i++) cin >> v1[i];
        for(int i = 0; i < n; i++) cin >> v2[i];
        for(int j = 0; j < n; j++) {
            if(v2[j] < 60) {
                flag = true;
                break;
            }
            res += v1[j] * v2[j];
            w += v1[j];
        }
        res = res/w;
        if(res < x || flag) cout << "No" << endl;
        else cout << "Yes" << endl;
    }
}

3. 染色数组

题目

image.png

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<uint64_t> nums(n, 0);
    for(int i = 0; i < n; i++) cin >> nums[i];
    string s;
    cin >> s;
    uint64_t t1 = 0, t2 = 0;
    int mod = static_cast<int>(1e9 + 7);
    for(int i = 0; i < n; i++) {
        if(s[i] == 'R') {
            t1 = (t1 + nums[i]) % mod;
        }
        else {
            t2 = (t2 + nums[i]) % mod;
        }
    }
    cout << (t1 * t2) % mod << endl;
}

本题需要运用乘法分配律来简化求值的过程。其次有几个注意事项:

  1. 在内存允许的情况下,先无脑用uint64_t
  2. 注意科学计数法的写法1e9+7
  3. 对于两个大数的乘积的取余数,可直接先在累加的过程中取余数,不影响最后的答案

4. 汽车

题目

image.png

代码

#include <bits/stdc++.h>

using namespace std;

struct Idx {
    int index;
    int v;
};

struct U {
    int index;
    int p;
    int v;
};

bool cmp(Idx a, Idx b) {
    return a.v < b.v;
}

bool cmp2(U a, U b) {
    return a.index < b.index;
}

int main() {
    int n;
    cin >> n;
    vector<int> pos(n, 0);
    vector<Idx> vec(n, Idx());
    for(int i = 0; i < n; i++) {
        int p, v;
        cin >> p >> v;
        pos[i] = p;
        vec[i].index = i;
        vec[i].v = v;
    }
    sort(pos.begin(), pos.end());
    sort(vec.begin(), vec.end(), cmp);
    vector<U> ret(n);
    for(int i = 0; i < n; i++) {
        ret[i].index = vec[i].index;
        ret[i].p = pos[i];
        ret[i].v = vec[i].v;
    }
    sort(ret.begin(), ret.end(), cmp2);
    for(int i = 0; i < n; i++) {
        cout << ret[i].p << " " << ret[i].v << endl;
    }
}

先直接对速度和位置进行排序,逐个匹配上,但这样就丢失了原来的位置信息。因为最后是需要按照原先的速度的顺序来输出的。可同时原先的速度的序列号,然后再赋值到同一个数组中,再按照序列号排序即可

最大公约数

题目

image.png

代码

#include <iostream>
#include <algorithm>

using namespace std;

int gcd(int a, int b) {
    if(b == 0) return a;
    return gcd(b, a % b);
}

int main() {
    int t;
    cin >> t;
    for(int i = 0; i < t; i++) {
        int a, b, k;
        cin >> a >> b >> k;
        
        int maxV = 0;
        for(int i = 0; i < k; i++) {
            maxV = max(maxV, gcd(a + i, b + k - i));
        }

        cout << maxV << endl;
    }
}

  1. 快速求两个数的最大公约数的方法:a, b = b, a % b
  2. 由于K并不是很大,可以尝试挨个枚举