BestCoder Round #59 Reorder the Books

题目链接: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);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值