zoukankan      html  css  js  c++  java
  • STL or Force --- CSU 1553: Good subsequence

     Good subsequence

    Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1553


    Mean: 

    给你一个长度为n的序列和一个值k,让你找出一个子序列,满足在这个子序列中max-min的值<=k,求这个子序列最长的长度。

    analyse:

    这题做法很多,直接暴力枚举每一个数为起点。

    Time complexity: O(n)

    Source code: 

    方法一(暴力):

    //  Memory   Time
    //  1347K     0MS
    //   by : crazyacking
    //   2015-03-30-16.02
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<climits>
    #include<iostream>
    #include<algorithm>
    #define MAXN 1000010
    #define LL long long
    using namespace std;
    int n,k;
    vector<int> ve;
    int main()
    {
            ios_base::sync_with_stdio(false);
            cin.tie(0);
    //      freopen("C:\Users\Devin\Desktop\cin.cpp","r",stdin);
    //      freopen("C:\Users\Devin\Desktop\cout.cpp","w",stdout);
            while(cin>>n>>k)
            {
                    ve.clear();
                    for(int i=0;i<n;++i)
                    {
                            int tmp;
                            cin>>tmp;
                            ve.push_back(tmp);
                    }
                    int ans=1;
                    for(int i=0;i<n;++i)
                    {
    
                            int cnt=1;
                            int maxx=ve[i];
                            int minn=ve[i];
                            for(int j=i+1;j<n;++j)
                            {
                                    if(ve[j]>=maxx)
                                    {
                                            maxx=ve[j];
                                    }
                                    if(ve[j]<=minn)
                                    {
                                            minn=ve[j];
                                    }
                                    if(maxx-minn>k) break;
                                    cnt++;
                            }
                            if(cnt>ans) ans=cnt;
                    }
                    cout<<ans<<endl;
            }
            return 0;
    }
    /*
    
    */
    View Code

    方法二(STL):

    做法很巧妙,用一个multiset来维护:加入当前这个数后满足条件的连续子序列,也就是说每一轮循环set中的元素都是满足条件的。

    //  Memory   Time
    //  1347K     0MS
    //   by : crazyacking
    //   2015-03-30-15.53
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<set>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<climits>
    #include<iostream>
    #include<algorithm>
    #define MAXN 1000010
    #define LL long long
    using namespace std;
    int n,k;
    multiset<int> se;
    vector<int> ve;
    int main()
    {
            ios_base::sync_with_stdio(false);
            cin.tie(0);
    //      freopen("C:\Users\Devin\Desktop\cin.cpp","r",stdin);
    //      freopen("C:\Users\Devin\Desktop\cout.cpp","w",stdout);
            while(cin>>n>>k)
            {
                    se.clear();
                    ve.clear();
                    for(int i=0;i<n;++i)
                    {
                            int tmp;
                            cin>>tmp;
                            ve.push_back(tmp);
                    }
                    int ans=1;
                    for(int i=0,j=0;i<n;++i)
                    {
                            se.insert(ve[i]);
                            for(;*se.rbegin()-*se.begin()>k;j++)
                            {
                                    se.erase(ve[j]);
                            }
                            if(i-j+1>ans) ans=i-j+1;
                    }
                    cout<<ans<<endl;
            }
            return 0;
    }
    /*
    
    */
    View Code

     

  • 相关阅读:
    Linux学习1-Xshell连接阿里云ECS服务器
    关于面试总结11-selenium面试题
    Word中如何公式居中标号右对齐
    Visio中如何画面积一样的形状
    Visio整体移动
    Visio中汇总两个箭头
    Matlab中ismember用法
    Visio中插入公式
    Visio中如何让重叠图形都显示
    如何命令行编译Java工程
  • 原文地址:https://www.cnblogs.com/crazyacking/p/4378466.html
Copyright © 2011-2022 走看看