2019CCPC-江西省赛-Wave
程序员文章站
2022-05-15 22:53:27
...
Problem Description
Avin is studying series. A series is called “wave” if the following conditions are satisfied:
- It contains at least two elements;
- All elements at odd positions are the same;
- All elements at even positions are the same;
- Elements at odd positions are NOT the same as the elements at even positions.
You are given a series with length n. Avin asks you to find the longest “wave” subseries. A subseries is a subsequence of a series.
Input
The first line contains two numbers n, c (1 ≤ n ≤ 100, 000, 1 ≤ c ≤ 100). The second line contains n integers whose range is [1, c], which represents the series. It is guaranteed that there is always a “wave” subseries.
Output
Print the length of the longest “wave” subseries.
Sample Input
5 3
1 2 1 3 2
Sample Output
4
题目大意
Avin正在研究序列。若符合下列条件,则称为“波”:
1)至少包含两个元素;
2)所有奇数位置的元素都是相同的;
3)所有偶数位置的元素都是相同的;
4)奇数位置的元素与偶数位置的元素不相同。
给出一个长度为n的序列。Avin要求你找出最长的“波”子序列。
核心思想:
c的范围是1~100,用vec[i]有序存储数值i出现的位置。
波序列只含有两个不同的元素,而c的范围又很小,枚举所含元素的所有情况。对于每种情况,算出一个序列长度,输出最长的序列长度即可。
时间复杂度:
两重for循环c2,遍历数值的位置n/c,所以c2Xn/c=nXc。
时间复杂度为O(nXc)。
代码如下:
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
vector<int>vec[110];
int main()
{
int n,c,x;
while(scanf("%d%d",&n,&c)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
vec[x].push_back(i);
}
int ans=0;
for(int i=1;i<=c;i++)
for(int j=1;j<=c;j++)
{
if(i==j)continue;
int sum=0,k=0;//sum记波序列长度,k记前一个元素的位置
int p=0,q=0;//p遍历i的位置,q遍历j的位置
int ep=vec[i].size(),eq=vec[j].size();
while(1)
{
//处理奇位置
while(p<ep&&vec[i][p]<k)p++;
if(p==ep)
break;
k=vec[i][p];
sum++;
//处理偶位置
while(q<eq&&vec[j][q]<k)q++;
if(q==eq)
break;
k=vec[j][q];
sum++;
}
ans=max(ans,sum);
}
printf("%d\n",ans);
for(int i=0;i<=c;i++)
vec[i].clear();
}
return 0;
}
上一篇: Vue跨页面传值
下一篇: java中数据的5种存储位置