秋招笔试题专栏——贪心

69 阅读2分钟

1. 整理

题目

image.png

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> v(n, 0);
    for(int i = 0; i < n; i++) cin >> v[i];
    unsigned long long result = 0;
    sort(v.begin(), v.end());
    for(unsigned int i = 1; i < v.size(); i++) {
        result += v[i] - v[i-1];
    }
    cout << result << endl;
}

本题比较简单,直接排序再计算差值即可。

2. 字符串前缀

题目

image.png

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    string s, t;
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> s >> t;
        int j = 0, k = 0;
        int cnt = 0;
        for(int j = 0; j < min(s.size(), t.size()); j++) {
            if(s[j] != t[j]) cnt++;
        }
        if(s.size() > t.size()) cnt += s.size() - t.size();
        cout << cnt << endl;
    }
}

因为字符串的前缀必然是有序且一一对应的,直接挨个比较不同的字符个数,最后再删掉多余的字符即可。

3. 塔子哥的数字

题目

image.png

代码

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

void solve() {
    string a;
    int b;

    cin >> a >> b;

    for (int i = 0; i < a.size(); ++i) {
        // 从小到大枚举,一旦找到一个小于 b 的数字,就将 b 插入在其之前
        if (a[i] < (b + '0')) {
            cout << a.substr(0, i) + to_string(b) + a.substr(i) << "\n";
            return ;
        }
    }

    // 如果 b 小于 a 中所有数字,就将 b 插入到所有数之后即可。
    cout << a + to_string(b) << "\n";
}

int main()
{
    int T;
    cin >> T;
    while (T--) solve();

    return 0;
}

4. 制作骰子

题目

image.png

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin >> t;
    for(int i = 0; i < t; i++) {
        int n;
        cin >> n;
        vector<int> vec(n, 0);
        for(int i = 0; i < n; i++) cin >> vec[i];
        sort(vec.begin(), vec.end());
        bool ok = true;
        int ans = (vec[0] + vec[n-1]);
        for(int i = 0, j = n-1; i < j; i++, j--) {
            if(vec[i] + vec[j] != ans) {
                ok = false;
                break;
            }
        }
        if(ok) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}

对于一组有序的数据来说,想要它两两的和相等,必然是首尾挨个取一个元素相加,接下来只要挨个判断是否相等即可。

5. 回文串

题目

image.png

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;
    cin >> s;
    int cnt = 0;
    for(int i = 0; i < s.size()/2; i++) {
        if(s[i] != s[s.size() - 1 - i]) cnt++;
    }
    // 原本就是回文串
    if(cnt == 0) {
        for(int i = 0; i < s.size(); i++) {
            if(s[i] != 'a') {
                s[i] = 'a';
                s[s.size() - 1 - i] = 'a';
                break;
            }
        }
    }
    // 有一个字符不相等
    else if(cnt == 1) {
        for(int i = 0; i < s.size(); i++) {
            if(s[i] != s[s.size() - 1 -i]) {
                // 如果不相等的另外一个是'a'且字符串是奇数,则修改中间的
                if(s[i] == 'a' || s[s.size() - 1 -i] == 'a') {
                    if(s.size()/2) s[s.size()/2] = 'a';
                }
                s[i] = 'a';
                s[s.size()-1-i] = 'a';
            }
        }
    }
    else {
        // 取较小的字符赋值即可
        for(int i = 0; i < s.size(); i++) {
            if(s[i] != s[s.size()-1-i]) {
                s[i] = min(s[i], s[s.size()-1-i]);
                s[s.size()-1-i] = min(s[i], s[s.size()-1-i]);
            }
        }
    }
    cout << s << endl;
}