扑克洗牌
题目描述
Nanarikom 有 n 张扑克牌。初始状态下,牌堆中第 i 张扑克牌上的数字为 i。
为了进行洗牌,Nanarikom 每次会进行以下操作中的一种:
- 从牌堆顶取出 1 张牌,插入到牌堆的任意位置中。
- 从牌堆底取出 1 张牌,插入到牌堆的任意位置中。
在操作过程中,牌堆内未被取出的牌相对顺序保持不变。
现在,Nanarikom 想要衡量牌堆的混乱程度。具体地,对于给定的牌堆,Nanarikom 想知道,从初始状态牌堆变换到给定牌堆所需的最小操作次数。
你需要回答 Nanarikom 的 T 组询问。
输入
第一行包含一个整数 T(),代表测试数据组数。对于每组测试数据:
第一行包含一个整数 n(),代表扑克牌的数量;
第二行包含 n 个整数 a1,a2,…,an(1≤ai≤n),代表给定的牌堆顺序。
输入数据保证 ,且 a1,a2,…,an 是一个排列。
输出
对于每组测试数据,输出一个整数,代表完成变换的最小操作次数。
样例输入
1
5
4 1 2 5 3
样例输出
2
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int T;
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>T;while(T--){ll n;cin>>n;vector<ll>a(n+1,0);vector<ll>pos(n+1,0);for(ll i=1;i<=n;i++){cin>>a[i];pos[a[i]]=i;}ll ans=1,len=1;for(ll i=2;i<=n;i++){if(pos[i]>pos[i-1]){len++;}else{len=1;}if(len>ans)ans=len;}cout<<n-ans<<"\n";}return 0;
}
我在解这道题时,出现的问题:
1.忽略了n=1这一特殊情况,按平时的习惯,将ans初始化为0。本题应将ans初始化为1。
2.思考的漏洞:将ans的刷新放入了pos[i]<pos[i-1]的选择中。导致如果i=n时pos[i]仍然大于pos[i-1],ans无法及时刷新。