zoukankan      html  css  js  c++  java
  • CF ER92 abc

    传送门

    A LCM Problem standard input/output 2 s, 256 MB Submit x14222

    看了一下,发现最小的LCM x,y 应该有一个是L, 当连续两个数 则 LCM为 L*(L+1)  如果是L 2L 那么LCM为2L,明显是最小的 如果 L 2L 不在 L R中那么无解, 否则输出 L 2L即可
    B Array Walk standard input/output 2 s, 256 MB Submit x4503

    相当于 每次不往左走的话,能直接从 a1 走到 ak+1,  然后当a1到 ak+1 如果有两个连续的值和大于 ak+ak+1的话就用最大的和替换掉 ak+ak+1

    然后因为替换了 多走了两步, 所以最多只能走到ak-2 以此类推

    因为总数小于3e5 所以可以直接枚举

    两种方法枚举,

      第一种 枚举向左走的步数0-z,每次能到的位置为 k-2*z+1 然后记录下所有走过的步值总和 和 最大的相邻两步之和,向左的两步都走最大和   O(zk)

      第二种 枚举步数0-k 然后每次记录每次能向左走的步数  储存最大值    O(k)

    还可以用dp, dp[i][j]  走到第 i 处,向左走了 j 步    O(kz)

      状态转移方程为 dp[i][j] = max(dp[i][j], dp[i-1][j]+a[i]);  向左走一步 

        if(i!=0 and j+1!=z)   dp[i-1][j+1] = max(dp[i-1][j+1], dp[i][j]+a[i-1]);  从向右走一步

    C Good String standard input/output 2 s, 256 MB Submit x5918

    变换一下, 会发现 一个good string 是这样的  s2s3s4s5s6s7……sns1 ==  sns1s2s3s4s5s6s7……sn-1, 对应一下也就是 s1 == s3 == sn-1 == s5 == s7

    s2 == s4 == s6 == sn, good string 就是一个循环节<=2 的字符串, 然后字符串的字符为 0-9 那么我们可以直接暴力枚举所有的循环节情况 一共 (10*10) 100种, 然后找到最长的good string, 总长度减去最长的good string即可, 代码如下  O(100*|s|)   |s| <= 2e5

    D Segment Intersections standard input/output 2 s, 256 MB Submit x1044  不想补。。。

    #include<bits/stdc++.h>
    
    using namespace std;
    #define ll long long
    #define _for(i,a,b) for(int i = (a); i < (b); i++)
    #define _rep(i,a,b) for(int i = (a); i <= (b); i++)
    void taskA() {
        ios::sync_with_stdio(false), cin.tie(nullptr);
        int t; cin >> t;
        while(t--) {
            int l, r; cin >> l >> r;
            if(l*2 <= r) cout << l << " " << 2*l << "
    ";
            else cout << "-1 -1
    ";
        }
        return;
    }
    View A Code
    void taskB1() {
        int t; cin >> t;
        while(t--) {
            int n,k,z; cin >> n >> k >> z;
            vector<int> a(n+1);
            _rep(i,1,n) cin >> a[i];
            int ans = 0;
            _rep(z1,0,z) {
                int x = 1, x1 = 0;
                int y = k+1-2*z1, ma = 0, s = 0;
                if(y < 1) continue;
                _for(i,1,y+1) {
                    ma = max(ma, a[i]+a[i+1]), s += a[i];    
                }    
                ans = max(ans, s+ma*z1);
            }
            //ans += a[y];
            cout << ans << "
    ";
        }
        return; 
    }
    View B1 Code
    void taskB2() {
        int t; cin >> t;
        while(t--) {
            int n,k,z; cin >> n >> k >> z;
            vector<int> a(n, 0);
            _for(i,0,n) cin >> a[i];
            int s = 0, mx = 0, ans = 0;
            _rep(i,0,k) {
                if(i<n-1) mx = max(mx, a[i]+a[i+1]);
                s += a[i];
                if(i%2 == k%2) {
                    int tmp = (k-i)/2;
                    if(tmp <= z)
                        ans = max(ans, s+mx*tmp);
                }
            } cout << ans << "
    ";
        } return;
    }
    View B2 Code
    void taskB3() {
        int t; cin >> t;
        while(t--) {
            int n,k,z; cin >> n >> k >> z;
            int dp[k+1][z+1] = {};
            vector<int> a(n);
            _for(i,0,n) cin >> a[i];
            _for(i,0,z) dp[0][i] = 0;
            _rep(i,1,k) _rep(j,0,z) {
                int pos = k-i-2*j;
                if(pos<0 or pos>=n) { dp[i][j] = (-1e9); continue; }
                dp[i][j] = max(dp[i][j], dp[i-1][j]+a[pos+1]);
                if(pos!=0 and j!=z) 
                    dp[i][j] = max(dp[i][j], dp[i-1][j+1]+a[pos-1]);
            }
            int ans = 0;
            _rep(i,0,z) ans = max(ans, dp[k][i]);
            cout << ans+a[0] << "
    ";
        }
        return;
    }
    View dp Code
    void taskB3() {
        int t; cin >> t;
        while(t--) {
            int n,k,z; cin >> n >> k >> z;
            int dp[k+1][z+1] = {};
            vector<int> a(n);
            _for(i,0,n) cin >> a[i];
            _for(i,0,z) dp[0][i] = 0;
    
            int ans = 0;
            _rep(i,1,k) _rep(j,0,z) {
                dp[i][j] = max(dp[i][j], dp[i-1][j]+a[i]);
                if(i+2*j == k) ans = max(ans, dp[i][j]);
                if(j+1 <= z) dp[i-1][j+1] = max(dp[i-1][j+1], dp[i][j]+a[i-1]);
                if(i-1+2*(j+1) == k) ans = max(ans, dp[i-1][j+1]);
            }
            cout << ans+a[0] << "
    ";
        }
        return;
    }
    View dp2 Code
    void taskC() {
        int t; cin >> t;
        while(t--) {
            string s; cin>>s;
            int n = s.size(), ans = 0;
            _for(i,0,10) {
                int ma = 0;
                _for(j,0,10) {
                    int x = i, y = j, res = 0;
                    for(auto c : s) 
                        if(c-'0' == x)
                            res++, swap(x, y);//妙啊 上一个匹配成功换下一个
                    if(x!=y and res%2==1) res--;// 如果总数有多类似 12121 那么需要-1
                    ans = max(ans, res);
                }
            } cout << n-ans << "
    ";
        } return;
    }
    View C Code

     

    int main() {
        ios::sync_with_stdio(false), cin.tie(nullptr);
    //    taskB3();
      taskC();
    return 0; }
  • 相关阅读:
    Linux硬盘分区方案
    mysql笔记四:索引查询及处理
    thread 学习笔记
    mysql笔记二:基本数据库、表查询操作
    linux 自学系列:监测端口占用情况
    linux 自学系列:命令行传输文件
    mysql笔记三:基本数据库、表创建更新操作
    mysql笔记五:权限管理
    threading源代码问题,为什么要将引入的变量del?
    linux 自学系列:更改系统语言编码
  • 原文地址:https://www.cnblogs.com/163467wyj/p/13420327.html
Copyright © 2011-2022 走看看