题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5500
题目又臭又长……题意是说,一堆书本来是按编号从上往下依次增大的顺序堆好的,现在被打乱了,我们每次能操作的是从中间抽出一本书放到最上面,问我们最少需要的操作数。
当然,因为n最大才19,你当然可以去暴力求解,暴力深搜绝对能够搞定的,但是那么这么一道想法题便数去了意义,我们得去认真思考才能有所收获,我们先,仔细想想,那些书是我们必须要移动才行的呢,首先小编先给出一个例子(样例实在是没什么参考价值),1,4,3,2,5,我们要达到的状态呢就是1,2,3,4,5,因为我们每一次操作都是把抽出来的放在最上面,那么我们就从最下面开始思考,就这个样例而言,最后4是在5的上面的,那么不难想到,这中间的书一定是会被移动的,不然没法达到这个状态,再仔细思考,4的前面是1,但是最终状态4的前面应该是3,那么中间的数肯定又会被移动,所以这个1是一定会被移动的。再思考,就这个样例而言肯定是先移动2,再移动3,因为如果我们先移动小的,再移动大的,我们又会再移动一次,所以中间有几个我们就移几次,因为这个顺序我们都是能控制好的,所以我们按从大到小的顺序,从下面往上面扫,不是按顺序的操作数就+1,就能得到我们的答案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[20];
int main()
{int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=0; i<n; i++)scanf("%d",&a[i]);int num = 0,Max = n;for(int i=n-1; i>=0; i--)if(a[i] == Max)Max--;else num++;printf("%d\n",num);}
}