zoukankan      html  css  js  c++  java
  • Codeforces Round #649 (Div. 2) A、B、C、

    题目
    题意:给出一长度为n的数组,问该数组的最长子数组的和不能被x整除。子数组是原数组数组从前或从后删除0个或全部个元素。
    解法:首先判断是否所有元素被x整除,则如果是该子数组不存在输出-1,然后判断整个数组的和是否被x整除,如果不能答案为n。如果能从前或从后找到一个不能整除x的元素,删除遍历到的x所有元素即满足条件。

    int n , m ;
    int a[maxn] ;
    void solve(){
        int sum = 0 , flag = 1;
        cin >> n >> m ;
        rep(i , 1,  n){
            cin >> a[i];
            sum += a[i];
            if(a[i] % m != 0) flag = 0 ;
        }
        if(flag){
            cout << -1 << endl;
            return;
        }
        if(sum % m != 0){
            cout << n << endl;
            return ;
        }
        int ma = -1 , l , r ;
        rep(i , 1 , n){
            if(a[i] % m != 0){
                l = i ;
                break;
            }
        }
        red(i , n , 1){
            if(a[i] % m != 0){
                r = i ;
                break;
            }
        }
        cout << max(n - l , r-1) << endl;
     
    }
    

    B题意:给出一个n个数的排列,找到一个子序列的值最大且长短最短,假设序列为s1,s2,s3,s4,该序列的值为|s1-s2|+|s2-s3|+|s3-s4|。
    解法:分析可知找出该序列的所有拐点(波峰或波谷),这些拐点组成的子序列值最大且最大。

    const int maxn = 1e5+9;
    int a[maxn];
    void solve(){
        int n ;
        cin >> n ;
        rep(i , 1 , n){
            cin >> a[i];
        }
        vector<int>v;
        v.pb(a[1]);
        rep(i , 2 , n-1){
            if((a[i] > v.back() && a[i+1] < a[i]) || (a[i] < v.back() && a[i] < a[i+1])){//波峰或波谷
                v.pb(a[i]);
            }
        }
        v.pb(a[n]);
        cout << size(v) << endl;
        for(auto i : v){
            cout << i << " " ;
        }
        cout << endl;
    }
    

    C题意:给出一个长为n的a数组,0<=ai<=i(该条件保证了b数组存在),对于 i (1<=i<=n) 有:MEX({b1, b2, …, bi})=ai.求b数组.mex是不存在集合中的最小自然数。
    解法:可以发现ai != ai-1 , 时有bi = ai-1,可以填充b数组一部分,剩下的部分升序填充。

    const int maxn = 1e5+9;
    int a[maxn];
    int b[maxn];
    int vis[maxn];
    void solve(){
        int n ;
        cin >> n ;
        ME(b , -1);
        rep(i , 1 , n){
            cin >> a[i];
            if(i > 1 && a[i] != a[i-1]){
                b[i] = a[i-1];
                vis[b[i]] = 1;//将该数加入mex集合
            }
        }
        vis[a[n]] = 1 ;//加入集合
        int m = 0 ;
        int i = 1 ;
        while(i <= n){
            if(b[i]==-1){
                while(vis[m]){//找到b集合的mex
                    m++;
                }
                b[i] = m ;//填充
                vis[m] = 1;//加入
            }
            i++;
        }
        rep(i , 1 , n){
            cout << b[i] << " " ;
        }
        cout << endl;
    }
    
  • 相关阅读:
    1049.(*) Counting Ones
    1135(重、错)Is It A Red-Black Tree
    3、如何判断一棵树是否是红黑树?
    2、以自定义struct或struct指针作为map的Key
    1、(★、※)如何判断一棵树是否是完全二叉树?
    1123.(重、错)Is It a Complete AVL Tree
    160819流水账
    150819流水账
    140819流水账
    130819流水账
  • 原文地址:https://www.cnblogs.com/nonames/p/13167733.html
Copyright © 2011-2022 走看看