zoukankan      html  css  js  c++  java
  • Codeforces Round #630 (Div. 2)(A~E)

    B. Composite Coloring

    题目链接

    题意:

    让你为n个数染色,要让相同颜色的两个数的gcd > 1 , 问怎么染, 题目保证可以让使用的颜色不大于11种。

    思路:

    偶数 :染颜色1
    奇数 ; 染他的最小质因子的指定色
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn =  2e3 + 10;
    #define ll long long
    #define ios std::ios::sync_with_stdio(false)
    #define int long long
    typedef unsigned long long ULL;
    int a[maxn];
    int ans[maxn];
    vector<int> su;
    map<int ,int>ma;
    signed main()
    {
        ios;
        cin.tie(0);///
        su.clear();
        su.push_back(2);///存1 ~ 1000以内的素数
        for(int i = 3 ; i < 1000 ; i += 2){
            bool ok = true;
            for(int j = 2 ; j < i - 1 ; j ++){
                if(i % j == 0){
                    ok = false ;
                    break;
                }
            }
            if(ok)su.push_back(i);
        }
        int t;
        cin >> t;
        while(t --){
            ma.clear();
            int n;
            cin >> n;
            for(int i = 1 ; i <= n ; i ++){
                cin >> a[i];
                ans[i] = 0;
            }
            int cnt = 1;
     
            for(int i = 1 ; i <= n ; i ++){
     
                for(int j = 0 ; j < su.size() ; j ++){
                    if(a[i] % su[j] == 0){
                        if(ma[su[j]] == 0)ma[su[j]] = cnt , cnt ++;///map存该素数对应颜色
                        ans[i] = ma[su[j]];
                        break;
                    }
                }
            }
            for(int i = 1 ; i <= n ; i ++){
                if(ans[i] == 0){
                    ans[i] = cnt , cnt ++;
                }
            }
            cout << cnt - 1 << '
    ';
            for(int i = 1 ; i <= n ; i ++){
                cout << ans[i] << ' ';
            }
            cout << '
    ';
     
        }
        return 0;
    }
    View Code

    C. K-Complete Word

    题目链接

    题意:

    给你个字符串,你可以操作让其中一个字符变为任意一个字符,问你要最少进行多少次操作才能让这个字符串变成一个周期为k的,且在一个周期内为回文的字符串。
    即使S(1 ~ k) = S(k + 1 ~ k + k)=...... 且子串S(1 ~k) 是回文。

    思路:

    遍历字符串,算每个字符的贡献。
    如:查看s(1) , s(k + 1) , s(2 * k + 1) ....哪个字符出现次数最多,就用这个字符,作整个字符串转变后的第一位的字符。
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn =  2e5 + 10;
    #define ll long long
    #define ios std::ios::sync_with_stdio(false)
    #define int long long
    char ch[maxn];
    int cnt[maxn][30];
    char ans[maxn];
    signed main()
    {
        ios;
        cin.tie(0);///
        int t;
        cin >> t;
        while(t --){
        int n , k;
        cin >> n >> k;
        cin >> ch + 1;
        for(int i = 0 ; i <= n ; i ++){
            for(int j = 0 ; j < 30 ; j ++){
                cnt[i][j] = 0;///初始化
            }
        }
        for(int i = 1 ; i <= n ; i += k){
            for(int j = i ; j < i + k ; j ++){
                cnt[j - i + 1][ch[j] - 'a'] ++;
            }
        }
        for(int i = 1 ; i <= (k + 1) / 2 ; i ++){
            int maxx = -1 , pos = -1;
            for(int j = 0 ; j < 30 ; j ++){
                cnt[i][j] += cnt[k - i + 1][j];///对折了一下,因为是回文
                if(maxx < cnt[i][j]){
                    maxx = cnt[i][j];
                    pos = j;
                }
            }
            ans[i] = ('a' + pos);
        }
        for(int i = 1 ; i <= (k + 1) / 2 ; i ++){
            ans[k - i + 1] = ans[i];
        }
        int c = 0;
        for(int i = 1 ; i <= n ; i += k){
            for(int j = i ; j < i + k ; j ++){
                if(ans[j - i + 1] != ch[j])c ++;
            }
        }
     
        cout << c << '
    ';
        }
        return 0;
    }
    View Code
  • 相关阅读:
    JS LeetCode 1423. 可获得的最大点数简单题解
    SpringBoot 学集 (第六章) Docker
    Linux 学记 (第三章)
    Linux 学记 (第二章)
    Linux 学记 (第一章)
    SpringBoot 学集 (第五章) Web开发续
    SpringBoot 学集 (第四章)Web开发
    SpringBoot 学集 (第三章) 日志框架
    SpringBoot 学集 (第二章) 配置文件
    SpringBoot 学集 (第一章)
  • 原文地址:https://www.cnblogs.com/GoodVv/p/12622368.html
Copyright © 2011-2022 走看看