Practice.
A. Technical Support
题意
给定一个由 
思路
如题,配对即可。
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = LONG_LONG_MAX, mod = 998244353;
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int q;
    cin >> q;
    while(q --){
        int n;
        cin >> n;
        string s;
        cin >> s;
        int cnt = 0;
        for(char e : s) {
            cnt += e == 'Q' ? 1 : -1;
            if(cnt < 0) cnt = 0;
        }
        cout << (cnt == 0 ? "Yes\n" : "No\n");
    }
} 别看错题((
B. Kevin and Permutation
题意
给定整数 
思路
想要尽量让差值最大,那么我们只有相间地输出,或者说,若我们按 
可以贪心地认为上述的思路是正确的,解法不唯一。
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = LONG_LONG_MAX, mod = 998244353;
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int q;
    cin >> q;
    while(q --){
        int n;
        cin >> n;
        for(int i=1;i<=n/2;i++){
            cout << n / 2 + i << ' ' << i << ' ';
        }
        if(n % 2 == 1) cout << n;
        cout << '\n';
    }
} 找规律+乱贪.jpg
C1. Make Nonzero Sum (easy version)
详见C2,区别是C1给定的数组没有0
C2. Make Nonzero Sum (hard version)
题意
给定一个由 
思路
首先,我们不考虑运算符号的时候,将所有数加起来会得到一个结果 
显然,若要让 
所以我们只需将 
有趣的是,这种解法不用考虑是否包含 
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = LONG_LONG_MAX, mod = 998244353;
int a[N];
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int q;
    cin >> q;
    while(q --){
        int n;
        cin >> n;
        int ans = 0;
        for(int i=1;i<=n;i++){
            cin >> a[i];
            ans += a[i];
        }
        if(abs(ans) % 2 == 1) cout << -1 << '\n';
        else{
            int r = 0;
            vector<pii> out;
            int left = ans / 2;
            if(left != 0) {
                int x = left / abs(left);
                r = 1;
                for (int i = 1; i < n; i++) {
                    if (a[i + 1] == x) {
                        out.emplace_back(i, i + 1);
                        r = i + 1;
                        i++;
                        left -= x;
                        if (left == 0) break;
                    } else {
                        out.emplace_back(i, i);
                        r = i;
                    }
                }
            }
            for(int i=r+1;i<=n;i++) out.emplace_back(i, i);
            if(left != 0) cout << -1 << '\n';
            else{
                cout << out.size() << '\n';
                for(auto e : out) cout << e.first << ' ' << e.second << '\n';
            }
        }
    }
} 想了半天不小心把两个难度一起做了((
- 本文链接 https://floating-ocean.github.io/blog_old/posts/64163075/
 - 版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!