• Codeforces Round #616 (Div. 2) (A-D)


    A. Even But Not Even

    仔细分析一下题意,可以发现只和奇数的个数有关:

    然后分情况讨论:

    1、奇数的个数是奇数

    2、奇数的个数是偶数

    3、奇数的个数为0

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <math.h>
    #include <cstdio>
    #include <iomanip>
    #include <time.h>
    #include <bitset>
    
    #define LL long long
    #define INF 0x3f3f3f3f
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define PI acos(-1)
    
    const double eps = 1e-9;
    const int maxn = 600;
    const LL mod = 1e9 + 7;
    
    using namespace std;
    
    
    int main() {
        int T;
        cin >> T;
        while (T--) {
            int n;
            cin >> n;
            string s;
            cin >> s;
            int eve = 0,odd = 0;
            for (int i = 0;i < n;i++) {
                if ((s[i]-'0') % 2 == 1)
                    odd++;
                else
                    eve++;
            }
            if (odd % 2 == 0 && odd > 0) {
                for (int i = 0;i < n;i++) {
                    if ((s[i]-'0')%2 == 1) {
                        cout << s[i];
                        odd--;
                    }
                    if (odd == 0)
                        break;
                }
                cout << endl;
            }
            else if (odd % 2 == 1 && odd > 1) {
                for (int i = 0;i < n;i++) {
                    if ((s[i]-'0')%2 == 1) {
                        cout << s[i];
                        odd--;
                    }
                    if (odd == 1)
                        break;
                }
                cout << endl;
            }
            else
                cout << -1 << endl;
        }
        return 0;
    }

    B. Array Sharpening

    根据题意,我们知道有三种模型:

    1、 0,1,2,3,4 .... n    递增模型

    2、n,n-1,n-2 .... 0       递减模型

    3、0,1,2,3 ... k ,k-1,k-2, ...   先增后减模型

    我们可以发现前两种模型可以转化为第三种模型,所以我们只要按第三种模型去匹配就可以了

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <math.h>
    #include <cstdio>
    #include <iomanip>
    #include <time.h>
    #include <bitset>
    
    #define LL long long
    #define INF 0x3f3f3f3f
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define PI acos(-1)
    
    const double eps = 1e-9;
    const int maxn = 3e5 + 10;
    const LL mod = 1e9 + 7;
    
    using namespace std;
    
    int a[maxn];
    
    int main() {
        int T;
        cin >> T;
        while (T--) {
            int n;
            cin >> n;
            for (int i = 0;i < n;i++) {
                cin >> a[i];
            }
            bool f = false;
            int i;
            for (i = 0;i < n;i++) {
                if (a[i] >= i)
                    continue;
                else
                    break;
            }
            if (a[i-1] >= n-(i-1)-1)
                ;
            else {
                cout << "No" << endl;
                continue;
            }
            for (int j = i;j < n;j++) {
                if (a[j] < n-j-1) {
                    cout << "No" << endl;
                    f = true;
                    break;
                }
            }
            if (!f)
                cout << "Yes" << endl;
        }
        return 0;
    }

    C. Mind Control

    题意:

    总共有n个人和n个数字
    n个人拍成一队,n个数字也是有顺序的
    你排在第m个位置
    按照顺序的每个人可以拿走这个序列中的第一个数字或者最后一个数字
    你可以在所有人操作开始前说服最多k个人
    让他们固定拿这个序列的第一个或者是最后一个数字
    问你在所有可能的情况中可以拿到的数字的最大值中的最小值(即,到你取得的时候,首尾两个数字你总是会取最大的那个,问这些数字中的最小值)

    首先看到 n 的范围才是3500,我们可以想到采取暴力求解

    最多可以说服 k 个人,那我们肯定就说服 k 个人(贪心)

    假设这 k 个人中有 i 个人选择前面的,那么就有 k - i 个人选择后面的  这样就留下了一个新的序列

    我的位置是在 m ,那么我前面还有 m-1-k 个人才会轮到自己选择

    假设说这 m-1-k 个人中有 j 个人选择了前面的,那么则有 m-1-k-j 个人选择了后面的

    这样选择完后就会漏出头和尾,我们直接选择头和尾最大的那个就好了

    对于 i 和 j 如何选择?

    暴力枚举就好了呀!

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <math.h>
    #include <cstdio>
    #include <iomanip>
    #include <time.h>
    #include <bitset>
    
    #define LL long long
    #define INF 0x3f3f3f3f
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define PI acos(-1)
    
    const double eps = 1e-9;
    const int maxn = 4000;
    const LL mod = 1e9 + 7;
    
    using namespace std;
    
    int a[maxn];
    
    int main() {
        int T;
        cin >> T;
        while (T--) {
            int n,m,k;
            cin >> n >> m >> k;
            for (int i = 1;i <= n;i++)
                cin >> a[i];
            k = min(k,m-1);
            int ans = 0;
            for (int i = 0;i <= k;i++) {
                int tmp = INF;
                for (int j = 0;j <= m-k-1;j++)
                    tmp = min(tmp,max(a[i+j+1],a[n-(k-i)-(m-k-1-j)]));
                ans = max(ans,tmp);
            }
            cout << ans << endl;
        }
        return 0;
    }

    D. Irreducible Anagrams

    分类讨论:

    1、长度为 1,肯定是 Yes

    2、头和尾不一样,肯定也是 Yes  因为我们给它反一下就可以了

    3、字符串中有三个或三个以上的不同的字符

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <math.h>
    #include <cstdio>
    #include <iomanip>
    #include <time.h>
    #include <bitset>
    
    #define LL long long
    #define INF 0x3f3f3f3f
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define PI acos(-1)
    
    const double eps = 1e-9;
    const int maxn = 2e5 + 10;
    const LL mod = 1e9 + 7;
    
    using namespace std;
    
    int vis[26][maxn];
    
    int main() {
        string s;
        int q;
        cin >> s;
        cin >> q;
        int len = s.length();
        for (int i = 0;i < len;i++) {
            vis[s[i]-'a'][i]++;
            if (i > 0) {
                for (int j = 0;j < 26;j++)
                    vis[j][i] += vis[j][i-1];
            }
        }
        while (q--) {
            int l,r;
            cin >> l >> r;
            l--,r--;
            if (l == r) {
                cout << "Yes" << endl;
                continue;
            }
            if (s[l] != s[r]) {
                cout << "Yes" << endl;
                continue;
            }
            int cnt = 0;
            for (int i = 0;i < 26;i++) {
                int R = 0,L = 0;
                R = vis[i][r];
                if (l > 0)
                    L = vis[i][l-1];
                if (R-L > 0)
                    cnt++;
            }
            if (cnt >= 3)
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
        return 0;
    }
  • 相关阅读:
    【iOS开发】动态添加子视图 UIView 的正确方法
    70.容器分配ip
    79.scp命令
    78.ssh隧道
    77.手撕sql语句
    76.ssh基于秘钥形式连接
    75.python删除目录
    74.ssh服务介绍(基于密码连接)
    73.nginx跨域
    72.nginx文件配置
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/12309782.html
Copyright © 2020-2023  润新知