CF605A
_32bit_Silentnight · · 题解
题目传送门
题目要用最少的操作次数使得数据为单调上升序列(我们使不进行移动的数字数量最大化)。
怎么让移动的次数最少呢?
我们用一个极端的样例试一试:
输入 输出
5 4
5
4
3
2
1
简述一下移动过程:
4 次。
所以,最多的移动次数为
但是有一些特殊的,例如下面的:1 8 4 2 7 3
3 次?!
为什么呢?1 2 3 可以永远不动,只需要 4 7 8 挨个往后移!
所以,次数为:
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b[200001]={0},i,m=-1,k=0,x;scanf("%d",&a);//定义变量。
/*
为什么要 b[200001]={0}?因为:第 8 句涉及到 b[0]。
m=-1 是保险起见。
*/
for(i=1;i<=a;i++){
cin>>x;
b[x]=b[x-1]+1;//关键,求“最长上升子序列”。
m=max(m,b[x]);//更新。
}
cout<<a-m;
}
重题 AT_agc024_b~~