您的位置:首页 > 产品设计 > UI/UE

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

2017-06-28 16:52 381 查看
题目链接: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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: