D- Wave [HDU-6570] 江西省赛

本文介绍了一种通过枚举不同元素来寻找给定序列中最长的Wave子序列的方法。Wave子序列需满足特定条件,包括奇数位和偶数位上的元素分别相同但彼此不同。文章提供了详细的算法实现思路及C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
给定一个序列
如果满足以下条件,则称为“wave”:
1)至少含有两种元素;
2)奇数位各元素相同;
3)偶数位各元素相同;
4)奇数位置的元素与偶数位置的元素不同。
给你一个长度为n的序列,要求你找到最长的“wave”子序列。
思路:
暴力枚举两种不同的数(但是枚举的时候要注意位置是否满足条件) 说不清 还是看代码吧 有注释 好理解

#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<cstdio>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e6+5;
vector<int> v[105];
int main()
{
	int n,c;
	scanf("%d%d",&n,&c);
	for(int i=0;i<n;i++)
	{
		int x;
		scanf("%d",&x);
		v[x].push_back(i);//把每个数x的位置记录下来 
	}
	int ans=-1;
	for(int i=1;i<=c;i++)
	{
		for(int j=1;j<=c;j++)
		{
			if(i==j)
				continue;
			int size1=v[i].size();
			int size2=v[j].size();
			int nowpos=0,cnt1=0,cnt2=0,sum=0;//nowpos记录上一个数的最后位置 
			while(1)
			{
				while(cnt1<size1&&v[i][cnt1]<nowpos)// 要找到比nowpos靠后的位置才算满足条件 
					cnt1++;
				if(cnt1==size1)
					break;
				nowpos=v[i][cnt1];
				sum++;
				while(cnt2<size2&&v[j][cnt2]<nowpos)
					cnt2++;
				if(cnt2==size2)
					break;
				nowpos=v[j][cnt2];
				sum++;
			}
			ans=max(ans,sum);
		}
	} 
	printf("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值