UVa11572 Unique Snowflakes (贪心+尺取法+set容器)

来源:互联网 发布:java获取当前端口号 编辑:程序博客网 时间:2024/06/06 07:30

题目链接:https://vjudge.net/problem/UVA-11572

题目大意:给你一段数字序列,从序列里取出一段子序列,要求子序列里没有重复的数字,让你求出子序列最大的长度是多少?

题目分析:序列的长度为1e6 那么n^2复杂度的算法基本被排除了,这里可以用到set,set的查找和输入都是logn级别的,那么我们只需要O(n)处理一下这个序列就好了

解决方法:尺取法,设l r ans ,根据贪心 r能取多大取多大,每次验证一下,如果不满足l++,在重复上一步,一直循环下去,直到r>=n

学到的东西:1>尺取法的应用:个人感觉关于求解有一定限制条件的序列的子序列的相关问题,尺取法可能会有发挥的地方

                        2>set的使用:查询数据是否重复时非常非常非常有用!!!

找到一篇大佬的博文,关于set的简单用法:http://blog.csdn.net/u010480899/article/details/52311316

代码:

#include <cstdio>#include <set>#include <algorithm>using namespace std;const int maxn=1e6+10;int a[maxn];int main(){    int T;while(~scanf("%d",&T)){    while(T--){        int n;scanf("%d",&n);        for(int  i=0;i<n;i++)scanf("%d",&a[i]);        set<int>s;        int l=0,r=0,ans=0;        while(r<n){            while(r<n&&!s.count(a[r])) s.insert(a[r++]);//set的插入与查找            ans=max(ans,r-l);            s.erase(a[l++]);//set的删除        }        printf("%d\n",ans);        }    }}


原创粉丝点击