• 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
  • 相关阅读:
    事务隔离级别
    OpenSessionInView
    图像平滑处理(滤波)
    [原]Nginx+Lua服务端合并静态文件
    检查数据倾斜分布
    SQL Server研究之统计信息—发现过期统计信息并处理具体解释
    GDALWarp设置GDALWarpOptions::dfWarpMemoryLimit过大时处理失败
    Android Studio 2.0 稳定版新特性介绍
    供应商和管理员查看供应商地址簿信息SQL
    Table AdvanceTable针对表内行禁用multipleSelection , singleSelection
  • 原文地址:https://www.cnblogs.com/GoodVv/p/12622368.html
Copyright © 2020-2023  润新知