cust23.guanjun的书

题目地址:http://oj.cust.edu.cn/problem/23/

 题目:

描述

guanjun是个非常爱整洁的人,在他家里有n本书,每本书有一个编号,编号从1号到n号。guanjun把这些书按编号从小到大,从上往下摞成一摞,guanjun对这些书很看重,不允许任何人动这套书。

有一天调皮的xp到guanjun家玩,由于临时有事,guanjun让xp自己呆在他家。xp对这套书非常好奇,偷偷看了一下,结果把一摞书的顺序打乱了。

眼看着guanjun就要回来了,xp需要尽快把这摞书恢复到原先排好序的状态。由于每本书都非常重,所以xp能做的操作只有把一本书从书堆中抽出来,然后把这本书放在书堆的顶部。给你打乱的书的顺序,你能帮xp算算最少需要几次上述的操作,他才能把这套书恢复顺序?

输入

对于每组数据第一行为一个正整数 n(n≤1000) , n 表示这摞有多少本书。
接下来为一行n个由空格分开的正整数,表示xp打乱后的这摞书的书号顺序。

输出

对于每组数据,输出一行一个整数,表示xp最少需要几次操作才能将书顺序恢复。

样例输入1 复制

4
4 1 2 3
5
1 2 3 4 5

样例输出1

3
0

提示

对于第一组数据,我们先将3号书放到最上面,接着操作2号书,最后操作1号书,(4,1,2,3)→(3,4,1,2)→(2,3,4,1)→(1,2,3,4)。

对于第二组数据,这摞书本来就有序了,所以我们不需要任何操作。

思路:

乍一看以为是个模拟题,但是仔细一分析,只是一个思维题。因为只能取出书放在最前端,所以一定是以n为底,不断地取--n来放在n的前面。我们不妨举几个例子。

所以只要从后往前遍历,遇到n就t++并且n--。

代码:

#include<iostream>
using namespace std;
int a[1001];
int main()
{
    int n;
    while(cin>>n){
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        int k=n,t=0;
        for(int i=n;i>=1;i--){
            if(a[i]==k){t++;k--;}
        }
        cout<<n-t<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Zero_979/article/details/81282841
23