Sequence in the Pocket(题目链接)
题意:
将给定序列操作成非递减序列的最小操作次数,规则:每次只能选择一个元素并将其移动到序列的开头。
思路:
思维题,每次移动未符合非递减规则的最大元素,可以推理出从最大元素开始往左找次大元素,再找次次大元素...都不需要移动
灵光一现,最大元素往左找非递增子序列且不能中断
复杂度O(n)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100005], b[100005];
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
for(int i=1; i<=n; i++)
{
cin >> a[i];
b[i] = a[i];
}
sort(b+1, b+n+1);
int rb = n, ra = n;
int cnt = 0;
while(ra>=1)
{
if(b[rb] == a[ra])
{
rb--;
ra--;
cnt++;
}
else
ra--;
}
cout << n-cnt << endl;
}
}
笔者水平有限,若有错误欢迎纠正