Codeforces Round 859 (Div. 4)题解

简介: Codeforces Round 859 (Div. 4)题解

A

给定三个整数 a 、 b 和 c 使得这两个等式恰好有一个为真:

  • a+b=c
  • a−b=c

如果第一个方程为真,则输出 +,否则输出 -。

#include <bits/stdc++.h>
using namespace std;
void solve(){
    int a, b, c;
    cin >> a >> b >> c;
    cout << (a + b == c ? "+" : "-") << endl;
}
int main()
{
    freopen("test.in", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _t = 1;
    cin >> _t;
    while(_t -- ){
        solve();
    }
    return 0;
}

B

把所有偶数糖果都放前面,为了保证 Mihai will have strictly more candies than Bianca,偶数之和必须大于奇数之和,否则就输出NO
#include <bits/stdc++.h>
using namespace std;
void solve() {
    int n;
    cin >> n;
    int a = 0, b = 0;
    while (n--)
    {
        int x;
        cin >> x;
        if (x % 2 == 0) b += x;
        else a += x;
    }
    cout << (b > a ? "YES" : "NO") << endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _t = 1;
    cin >> _t;
    while (_t--) {
        solve();
    }
    return 0;
}

C

如果有两个相同的字母,它们下标之差为奇数,就输出NO,反之YES
#include <bits/stdc++.h>
using namespace std;
void solve(){
    int n;
    string s;
    cin >> n >> s;
    for(int i = 0; i < n; i ++ )
        for(int j = 0; j < i; j ++ )
            if(s[i] == s[j] && (i - j) & 1)
            {
                puts("NO");
                return;
            }
    puts("YES");
}
int main()
{
    freopen("test.in", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _t = 1;
    cin >> _t;
    while(_t -- ){
        solve();
    }
    return 0;
}

D

题目只在意数的奇偶性,所有存数组时可以只存奇偶,res为整个数组和的奇偶性,

下面的每个操作,如果把L~R中的数换成奇数,res加上区间内零的个数

如果换成偶数,res减去区间内一的个数,在判断res的奇偶性

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int s[N];
void solve(){
    int n, q;
    cin >> n >> q;
    for(int i = 1; i <= n; i ++ )
    {
        int x;
        cin >> x;
        s[i] = x & 1;
        s[i] += s[i - 1];
    }
    while(q -- )
    {
        int res = s[n] & 1;
        int l, r, k;
        cin >> l >> r >> k;
        if(k & 1) res ^= (r - l + 1) - (s[r] - s[l - 1]);
        else res ^= s[r] - s[l - 1];
        cout << (res & 1 ? "YES" : "NO") << endl;
    }
}
int main()
{
    freopen("test.in", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _t = 1;
    cin >> _t;
    while(_t -- ){
        solve();
    }
    return 0;
}

E

此题二分模板题,算一段区间和的时候记得初始化前缀和

难在它是交互问题,不适应输入输出的方式

#include <bits/stdc++.h>
using namespace std;
void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        a[i] += a[i - 1];
    }
    int l = 1, r = n;
    while (l < r)
    {
        int mid = l + r >> 1;
        cout << "?" << " " << mid - l + 1 << " ";
        for (int i = l; i <= mid; i++)
            cout << i << " ";
        cout << endl << endl;

        int x;
        cin >> x;
        if (x != a[mid] - a[l - 1]) r = mid;
        else l = mid + 1;
    }
    cout << "! " << r << endl;
}
int main()
{
    freopen("test.in", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _t = 1;
    cin >> _t;
    while (_t--)
    {
        solve();
    }
    return 0;
}

F

模拟,就遇到边界就拐弯,找到终点退出

有人可能会疑惑,为什么要循环2*n*m次,明明只有n*m个格子啊

有可能终点在球后面,而球初始移动方向是反方向,这样就需要走到尽头在拐回来才能遇见终点

#include <bits/stdc++.h>
using namespace std;
void solve(){
    int n, m;
    cin >> n >> m;
    int a, b, c, d;
    string s;
    cin >> a >> b >> c >> d >> s;
    int cnt = 0;

    for(int i = 1; i <= 2 * n * m; i ++ )
    {
        if(a == c && b == d) 
        {
            cout << cnt << endl;
            return;
        }

        bool f = false;
        if(s[1] == 'L' && b == 1)
        {
            s[1] = 'R';
            f = true;
        }
        else if(s[1] == 'R' && b == m)
        {
            s[1] = 'L';
            f = true;
        }
        if(s[0] == 'U' && a == 1)
        {
            f = true;
            s[0] = 'D';
        }
        else if(s[0] == 'D' && a == n)
        {
            f = true;
            s[0] = 'U';
        }
        
        if(f) cnt ++ ;

        if(s[0] == 'U') a -- ;
        else a ++ ;
        if(s[1] == 'L') b -- ;
        else b ++ ;
    }
    cout << -1 << endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _t = 1;
    cin >> _t;
    while(_t -- ){
        solve();
    }
    return 0;
}

G

结论:假设已经有了序列$c_1,c_2,c_3...c_k$,那么这个序列的各个子序列和,一定可以表示出$[1, \sum_1^kC_i]$内的所有数字。

所以将数组排序,维护一个前 i 项的和,遍历第 i 项时,前 i - 1 项的和一定要大于等于第 i 项

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
void solve(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i ++ ) cin >> a[i];
    sort(a, a + n);
    if(a[0] != 1)
    {
        cout << "NO" << endl;
        return;
    }
    long long sum = a[0];
    for(int i = 1; i < n; i ++ )
    {
        if(sum < a[i])
        {
            cout << "NO" << endl;
            return;
        }
        sum += a[i];
    }
    cout << "YES" << endl;
}
int main()
{
    freopen("test.in", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _t = 1;
    cin >> _t;
    while(_t -- ){
        solve();
    }
    return 0;
}
目录
相关文章
|
11月前
【CodeForces】Codeforces Round 857 (Div. 2) B
【CodeForces】Codeforces Round 857 (Div. 2) B
86 0
|
11月前
|
人工智能
|
人工智能 BI
Codeforces Round #805 (Div. 3) 题解
Codeforces Round #805 (Div. 3) 题解
Codeforces Round #805 (Div. 3) 题解
|
人工智能 索引
Codeforces Round #806 (Div. 4) 题解
Codeforces Round #806 (Div. 4) 题解
【算法题解】Codeforces Round #817 (Div. 4)题解
【算法题解】Codeforces Round #817 (Div. 4)题解
【算法题解】Codeforces Round #817 (Div. 4)题解
|
人工智能 算法