代码求条
  • 板块灌水区
  • 楼主Harley_Wu
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/9 19:26
  • 上次更新2024/10/9 21:02:18
查看原帖
代码求条
471331
Harley_Wu楼主2024/10/9 19:26

有一个序列 a1~an

初始时集合中只有一个元素 ai ,并有两个指针 l=r=i 。

每次可以选择如下两个操作之一,直到结束:

1.将l减一,然后检查集合中是否已有al。如果有,那么立即结束,否则往集合中插入al。

2.将r加一,然后检查集合中是否已有ar。如果有,那么立即结束,否则往集合中插入ar。

f(i)为能够结束的最小操作次数

给一个n 和一个序列a

n<=2e5

1<=a[i]<=1e9

保证序列有俩一样的数

#include<bits/stdc++.h>
using namespace std;
int n,a[200010],l,r,ans;
int dfs(int x,int y,bool flag)
{
	if(flag==0)
	{
		if(x==1) return 1e9;
		if(a[x]==a[x-1]) return y-x+1;
		else return dfs(x-1,y,0);
	}
	else if(flag==1)
	{
		if(x==n) return 1e9;
		if(a[x]==a[x+1]) return x-y+1;
		else return dfs(x-1,y,1);
	}
	
}
int main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	{
		cin>>a[i];
	} 
	for(int i=1;i<n;i++)
	{
		l=i,r=i;
		cout<<min(dfs(i,i,0),dfs(i,i,1))<<" ";
	}
	return 0;
} 
2024/10/9 19:26
加载中...