zoukankan      html  css  js  c++  java
  • OJ练习

    1、京东OJ 保卫方案 (单调栈)

    http://www.cnblogs.com/mengmz/p/7263915.html

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    struct node{
        int val;
        long count;
        node(int v, int c = 1): val(v), count(c){}
    };
    
    int main() {
        int N;
        while(cin >> N){
            vector<int> watch(N);
            for(int i = 0; i < N; ++i)
                cin >> watch[i];
    
            vector<node> v;
            node tmp(watch[0]);
    
            int max_h = watch[0];
            int max_index = 0;
            for(int i = 1; i < N; ++i){
                if(watch[i] == watch[i - 1])
                    tmp.count ++;
                else{
                    v.push_back(tmp);
                    if( max_h < tmp.val){
                        max_h = tmp.val;
                        max_index = v.size() - 1;
                    }
                    tmp.val = watch[i];
                    tmp.count = 1;
                }
            }
            // 最后一个元素
            v.push_back(tmp);
            if( max_h < tmp.val){
                max_h = tmp.val;
                max_index = v.size() - 1;
            }
            int n = 0;
            long count = 0;
            vector<node> stack;
            for(int i = max_index; n < v.size(); ++n, i = (i+1)%v.size()){
                while( stack.size() && v[i].val > stack[stack.size() - 1].val){
                    node & tmp = stack[stack.size() - 1];
                    count += 2 * tmp.count + tmp.count*(tmp.count - 1)/2;
                    stack.pop_back();
                }
    
                if( stack.size()){
                    if(v[i].val == stack[stack.size() - 1].val)
                        stack[stack.size() - 1].count += v[i].count;
                    else
                        stack.push_back(v[i]);
                } else
                    stack.push_back(v[i]);
            }
            while(stack.size()){
                node & tmp = stack[stack.size() - 1];
                count += tmp.count*(tmp.count - 1)/2;
                stack.pop_back();
                if(stack.size()) count += 2 * tmp.count;
                if(stack.size()==1 &&stack[stack.size()-1].count==1) count-=tmp.count;
            }
            cout << count<<endl;
        }
        return 0;
    }
    View Code

    2、2018 上海交大7月保研夏令营机试最后一题(最长子序列)

    #include <iostream>
    
    using namespace std;
    
    int findMax(int arr[], int p)
    {
        if (p == 0)
            return 0;
        int *maxArr = new int[p];
        maxArr[0] = arr[0];
        int len = 1;
        for (int i = 1; i < p; i++)
        {
            for (int j = len - 1; j >= 0; j--)
            {
                if (arr[i] > maxArr[j])
                {
                    if (j == len -1)
                    {
                        maxArr[len] = arr[i];
                        len++;
                    }
                    else
                    {
                        maxArr[j + 1] = arr[i];
                    }
                }
                else if (j == 0)
                {
                    maxArr[0] = arr[j];
                }
            }
        }
        
        for (int i = len - 1; i >= 0; i--)
        {
            if (arr[p] > maxArr[i])
            {
                delete [] maxArr;
                return i + 1;
            }
        }
        
        delete [] maxArr;
        return 0;
    }
    
    int main()
    {
        int n;
            cin >> n;
        int *numbers = new int[n];
        int *numbers_rev = new int[n];
            for (int i = 0; i < n; i++)
            {
                    cin >> numbers[i];
            }
        int incLen, decLen, tmp, maxLen = 0;
        for (int i = 0; i < n; i++)
        {
            numbers_rev[i] = numbers[6-i];
        }
        for (int i = 0; i < n; i++)
        {
            incLen = findMax(numbers, i);
            decLen = findMax(numbers_rev, n - i - 1);
            tmp = (incLen > decLen) ? decLen : incLen;
            if (2 * tmp + 1 > maxLen)
            {
                maxLen = 2 * tmp + 1;
            }
        }
        cout << maxLen << endl;
        delete [] numbers;
        delete [] numbers_rev;
        return 0;
    }
    View Code
  • 相关阅读:
    mybatis
    Enumeration接口
    oracle undo 解析(转载收藏)
    Windows下RabbitMQ的安装
    Aliyun服务器安装Docker
    Redis主从复制、哨兵模式
    Redis持久化-AOF
    Redis持久化-RDB
    Nginx快速上手
    有关Eureka的其他重点配置
  • 原文地址:https://www.cnblogs.com/lucifer1997/p/9552382.html
Copyright © 2011-2022 走看看