Codeforces Round #674 (Div. 3)

Codeforces Round #674 (Div. 3)

A.Floor Number

题意: 初始值为2,每次增加x,问增加多少层能够达到n

题解: 可以直接模拟,也可以直接计算出公式算

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
int const MAXN = 2e5 + 10;
int n, m, T;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> T;
    while(T--) {
        cin >> n >> m;
        int res = 0;
        if (n == 1 || n == 2) res = 1;
        else 
            res = (int)floor(((double)n - 3) / m) + 2;
        cout << res << endl;
    }
    return 0;
}

B.Symmetric Matrix

题意: 给定n种瓷砖,问这n种瓷砖是否能够构成按照主对角线对称的图形

题解: 只要最后图形的变成为偶数,同时存在左下角和右上角相同瓷砖即可构造出

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
int const MAXN = 2e5 + 10;
int n, m, T;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> T;
    while(T--) {
        cin >> n >> m;
        int cnt = 0;
        for (int i = 1; i <= n; ++i) {
            int a, b, c, d;
            cin >> a >> b >> c >> d;
            if (c == b) cnt++;
        }
        int flg = 1;
        if (m & 1) flg = 0;
        else {
             if (!cnt) flg = 0;
        }
        if (flg) puts("YES");
        else puts("NO");
    }
    return 0;
}

C.Increase and Copy

题意: 有2种操作,第一种是选择数组中一个数字加一,第二种是选择数组中一个数字复制一个,问最少进行多少次操作能够使得数组的元素总和大于等于n

题解: 分析可以知道,一定是先操作1,然后操作2次数最小,那么去枚举操作1的次数即可。答案就是i - 1 + (n - i) / i + (n % i != 0),发现是对勾函数,那么我枚举到根号即可。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
int const MAXN = 2e5 + 10;
int n, m, T;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> T;
    while(T--) {
        cin >> n;
        int res = n;
        for (int i = 1; (LL)i * i <= n; ++i) 
            res = min(res, i - 1 + (n - i) / i + (n % i != 0));
        cout << res << endl;
    }
    return 0;
}

D.Non-zero Segments

题意: 给出n个数,问至少插入几个数,可以使得数列里面不存在和为0的区间

题解: 只要遇到前缀相等就说明一段区间和为0,那么我们每次遇到前缀出现过,那我就答案加一,表明这个元素前面插入一个元素,当插入一个元素后,后续所有的前缀都是在加上这个元素的基础上进行操作,因此我们就需要把map清空,然后重新维护,在插入元素前面的前缀全部失效。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
int const MAXN = 5e6 + 10;
int n, m, T;
unordered_map<LL, int> mp;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    LL sum = 0;
    int res = 0;
    mp[0] = 1;
    for (int i = 1, t; i <= n; ++i) {
        cin >> t;
        sum += t;
        if (mp.count(sum)) {
            res++;
            mp.clear();
            mp[0] = 1;
            sum = t;
        }
        mp[sum] = t;
    }
    cout << res << endl;
    return 0;
}

E.Rock, Paper, Scissors

题意: a和b玩石头剪刀布,给出a和b出石头、剪刀、布的数量,问a最少赢多少次,最多赢多少次

题解: 题解见:https://tomjobs.blog.csdn.net/article/details/108858396?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
int const MAXN = 2e5 + 10;
int n, m, T;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    int a1, a2, a3;
    cin >> a1 >> a2 >> a3;
    int b1, b2, b3;
    cin >> b1 >> b2 >> b3;
    int ans1 = max({0, a1 - b1 - b3, a2 - b2 - b1, a3 - b3 - b2});
    int ans2 = min(a1, b2) + min(a2, b3) + min(a3, b1);
    cout << ans1 << " " << ans2 << endl;
    return 0;
}

F.Number of Subsequences

题意: 给出一个长度为n的字符串,其中有若干?,?的地方可以填abc中的任意字母

问填完?所得到的字符串集中,有多少个abc子序列

题解:

考虑dp

d p [ 0 ] dp[0] dp[0]代表字符串的数量

d p [ 1 ] dp[1] dp[1]代表字符串中子序列"a"的数量

d p [ 2 ] dp[2] dp[2]代表字符串中子序列"ab"的数量

d p [ 3 ] dp[3] dp[3]代表字符串中子序列"abc"的数量

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
int const MAXN = 2e5 + 10, mod = 1e9 + 7;
int n, m, T;
LL f[4];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    string s;
    cin >> s;
    s = " " + s;
    f[0] = 1;
    for (int i = 1; i <= n; ++i) {
        if (s[i] == 'a') f[1] = (f[1] + f[0]) % mod;
        if (s[i] == 'b') f[2] = (f[2] + f[1]) % mod;
        if (s[i] == 'c') f[3] = (f[3] + f[2]) % mod;
        if (s[i] == '?') {
            f[3] = (f[3] * 3 + f[2]) % mod;
            f[2] = (f[2] * 3 + f[1]) % mod;
            f[1] = (f[1] * 3 + f[0]) % mod;
            f[0] = f[0] * 3 % mod;
        }
    }
    cout << f[3] << endl;
    return 0;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页