【jzoj4891】【摆书】

来源:互联网 发布:微信服务号 域名备案 编辑:程序博客网 时间:2024/05/16 09:12

题目大意

给出1到n的排列,每次可把一个数提到队头,求最少次数是序列有序。

解题思路

答案为n-结尾为n的最长连续上升子序列。

code

#include<cstdio>#include<algorithm>#define LL long long#define min(x,y) ((x<y)?x:y)#define max(x,y) ((x>y)?x:y)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const maxn=1e5;int n,t,a[maxn+10];int main(){    freopen("book.in","r",stdin);    freopen("book.out","w",stdout);    scanf("%d",&t);    fo(cas,1,t){        scanf("%d",&n);        fo(i,1,n)scanf("%d",&a[i]);        int pre=n,ans=0;        fd(i,n,1){            int j=pre;            for(;j&&(a[j]!=i);j--);            ans+=pre-j;            pre=j-1;            if(pre<1)break;        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击