题目描述
Alice勤工俭学做纪中的图书管理员,学校让他管理一个小的图书室,里面有N本书,放书的地方是一个非常狭窄的书柜,以至于只能把一本书放在另一本书的上面,现在Alice要做的工作是把书按照编号排序。
Alice能轻易地把一本书从书柜里拔出来,但放到一堆书中去非常困难,所以只能把拔出来的书放到最上面,所以排序的唯一方法就是不停地拔出一本书再放到最上方。
给出N本书从上到下的编号,N本书用1到N编号,每本书的编号各不相同,要求Alice用最少的操作次数使得书柜中的书从上到下依次为1,2,…,N。例如N=3,一开始为(3,2,1),两次移动就可以完成,第一次拔出2放到最上面变成(2,3,1),第二次拔出1放到最上面变成(1,2,3)。
给出初始顺序,帮助Alice计算最少移动次数。
输入
第一行包含一个整数N(N<=300000)。
接下来N行,每行一个整数,从上到下描述书柜中书的编号。
输出
输出一个整数表示最少移动次数。
样例输入
3 3 2 1
样例输出
2
这题比较特殊,因为书本的排序必定是公差为 1 的等差数列,从小到大如:1 2 3 4 5 6 7 8 9,因此不用使用到数组
思路:
1、输入: 5 2 9 3 4 8 10 7 6 11 1
2、定义一个中间变量max,将第一个数赋值给max,只要比他小就拿出来,放入数组,比他大,就交换,比他大还有一种情况,就是9 - 5 不等于 1,因此,把 5 放入数组
3、如上边的例子,max=5>2,2抽出放入数组,max=5>9 且 9-5>1,交换max=9,5抽出放入数组,max=9>3,3抽出放入数组,max=9>4,4抽出放入数组。。。8放入数组,max=9<10且10-9=1,因此只做交换,max=10>7,7抽出放入数组,max=10>6,6抽出放入数组,max=10<11且11-10=1,因此只做交换,max=11>1,1抽出放入数组
4、被抽出放入数组的数据,从先到后依次为:2,5,3,4,8,7,6,1
5、然后再将这些书从大到小放入
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,max;
cin>>n;
int sum=0;
for (int i=0;i<n;i++) {
cin>>m;
if (i==0) {
max = m;
}
if (max>m) {
sum++;
}
if (max<m) {
if (m-max>1) {
sum++;
}
max=m;
}
}
cout<<sum;
}