• AtCoder Grand Contest 039


    A.给你一个字符串 复制K-1次首尾相接 每次你可以把任意位置的字符替换成任意一个 问你最少替换几次可以使得复制后的串任意两个相邻的字符不同

    解:一段长度为x的相同字符 要满足条件需要x/2次替换

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main() {
            string a;
            cin >> a;
            ll k;
            cin >> k;
            int len = a.size();
            if (len == 1) {
                    cout << k / 2 << endl;
            } else if (len == 2) {
                    if (a[0] == a[1]) {
                            cout << k << endl;
                    } else {
                            cout << 0 << endl;
                    }
            } else {
                    bool flg = 1;
                    for (int i = 1; i < len; i++) {
                            if (a[i] != a[0]) {
                                    flg = 0;
                                    break;
                            }
                    }
                    if (flg) {
                            cout << 1LL * len * k / 2 << endl;
                            return 0;
                    }
                    ll ans = 0;
                    char ch = '0';
                    int now = 0;
                    for (int i = 0; i <= len; i++) {
                            if (i == len || a[i] != ch) {
                                    ans += now / 2;
                                    ch = a[i];
                                    now = 1;
                                    continue;
                            }
                            now++;
                    }
                    int l = 0, r = 0;
                    if (a[0] == a[len - 1]) {
                            for (l = 0; l < len; l++)
                                    if (a[l] != a[0]) {
                                            l--;
                                            break;
                                    }
                            for (r = len - 1; r >= 0; r--)
                                    if (a[r] != a[0]) {
                                            r++;
                                            break;
                                    }
                            r = len - r;
                            l++;
                            ans -= l / 2 + r / 2;
                    }
                    ans *= k;
                    ans += 1LL * (l + r) / 2 * (k - 1);
                    ans += l / 2 + r / 2;
                    cout << ans << endl;
            }
    }
    View Code

    B.给你一个连通图 问你最多能把这个图分成几层(同层之间的点不能有边 类似于X分图)

    解:直接暴力从每个点开始BFS即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    vector<int> g[205];
    char f[205];
    int du[205];
    int lev[205];
    bool vis[205];
    int main() {
            int n;
            scanf("%d", &n);
            for (int i = 1; i <= n; i++) {
                    scanf("%s", f + 1);
                    for (int j = i + 1; j <= n; j++) {
                            if (f[j] == '1') {
                                    g[i].push_back(j);
                                    g[j].push_back(i);
                                    du[i]++, du[j]++;
                            }
                    }
            }
            queue<int> que;
            bool flag = 1;
            int ans = -1;
            for (int i = 1; i <= n; i++) {
                    //cout << "do " << i << endl;
                    fill_n(lev, n + 2, 0);
                    fill_n(vis, n + 2, 0);
                    flag = 1;
                    int ansnow = -1;
                    while (que.size()) {
                            que.pop();
                    }
                    que.push(i);
                    lev[i] = 1;
                    while (que.size() && flag) {
                            int x = que.front();
                            //cout << x << " " << lev[x] << endl;
                            que.pop();
                            vis[x] = 1;
                            for (int v : g[x]) {
                                    if (lev[v] == 0) {
                                            lev[v] = lev[x] + 1;
                                            ansnow = max(ansnow, lev[v]);
                                            que.push(v);
                                    } else if (lev[v] == lev[x] || abs(lev[v] - lev[x]) >= 2) {
                                            flag = 0;
                                            break;
                                    } else if (abs(lev[v] - lev[x]) == 1) {
                                            if (lev[v] < lev[x] && !vis[v]) {
                                                    flag = 0;
                                                    break;
                                            }
                                            if (lev[v] > lev[x] && vis[v]) {
                                                    flag = 0;
                                                    break;
                                            }
                                    }
                            }
                    }
                    if (flag) {
                            ans = max(ans, ansnow);
                    }
            }
            cout << ans << endl;
    }
    View Code

  • 相关阅读:
    字符串replaceAll()方法报错:java.util.regex.PatternSyntaxException:Unclosed group near index...
    eclipse导入Tomcat8源码
    [白话解析] 深入浅出朴素贝叶斯模型原理及应用
    [白话解析] 深入浅出一致性Hash原理
    [白话解析] 深入浅出贝叶斯定理
    [白话解析] 深入浅出边缘计算
    [梁山好汉说IT] 用实例来深入理解容器概念
    [梁山好汉说IT] 梁山好汉和抢劫银行
    [梁山好汉说IT] 梁山好汉和秒杀系统
    [梁山好汉说IT] 区块链在梁山的应用
  • 原文地址:https://www.cnblogs.com/Aragaki/p/11756210.html
Copyright © 2020-2023  润新知