题目链接:https://codeforces.com/problemset/problem/1223/D
题目大意:给你n个数,数的范围为[1,n]。把所有相同的数移到最前面或最后面为一次操作,问最少多少次操作可以使序列不递减。
思路:一开始看到觉得是dp,但贪心就可以了。找到最长不递减子串(不是单个数,是所有相同的数),然后答案就是不同数的个数减去这个子串的长度。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include <string>
using namespace std;
typedef long long ll;
int a[300010];
int l[300010],r[300010];
int main()
{
int T,n,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
r[a[i]]=i;
for(i=n;i>=1;i--)
l[a[i]]=i;
int last,ma,ans,num;
last=ma=ans=num=0;
for(i=1;i<=n;i++)
{
if(l[i])
{
if(last<l[i])ma++;
else ma=1;
num++;
ans=max(ans,ma);
last=r[i];
}
l[i]=0;
}
printf("%d\n",num-ans);
}
}