UVA 11572 Unique Snowflakes
2017-08-11 17:00
337 查看
题意:输入一个长度为n的序列A,找到一个尽量长的连续子序列Al~Ar,使得该序列中没有相同的元素
解题思路:从R=0开始不断增加R,相当于把所求的序列的右端点往右延伸,当无法延伸时(元素在该序列中出现过),只需增大L,并且继续延伸R,用set判断元素是否出现过,加假如出现过就删除Al,l++接着往下找,不断更新ans
代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
using namespace std;
const int maxn=1000000+5;
int A[maxn];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>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++]);
ans=max(ans,R-L);
s.erase(A[L++]);
}
cout<<ans<<endl;
}
return 0;
}
解题思路:从R=0开始不断增加R,相当于把所求的序列的右端点往右延伸,当无法延伸时(元素在该序列中出现过),只需增大L,并且继续延伸R,用set判断元素是否出现过,加假如出现过就删除Al,l++接着往下找,不断更新ans
代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
using namespace std;
const int maxn=1000000+5;
int A[maxn];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>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++]);
ans=max(ans,R-L);
s.erase(A[L++]);
}
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- uva 11572 unique snowflakes——yhx
- UVA - 11572 Unique Snowflakes
- BNU19990 UVA11572 Unique Snowflakes
- uva 11572 - Unique Snowflakes(和书略有不同)
- UVA - 11572 Unique Snowflakes 滑动窗口
- uva 11572 unique snowflakes——yhx
- UVA - 11572 Unique Snowflakes
- Uva11572-Unique Snowflakes
- [UVA11572]Unique Snowflakes[构造]
- UVa 11572 - Unique Snowflakes
- UVa--11572 Unique Snowflakes(尺取法)
- uva 11572 unique snowflakes——yhx
- UVa 11572 Unique Snowflakes——思路题
- UVa11572 Unique Snowflakes (贪心+尺取法+set容器)
- UVA11572_Unique Snowflakes
- UVA - 11572 Unique Snowflakes 滑动扫描
- UVA11572 Unique Snowflakes(滑窗)
- UVA 11572 - Unique Snowflakes
- uva 11572 - Unique Snowflakes(Towpointer)
- UVA ~ 11572 ~ Unique Snowflakes(滑动窗口)