C++算法,图书管理员

题目描述

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
具体功能要求 1、图维护 (1)设置管理账号和密码; (2)图信息录入:图编号名、作者名、分类、图数量; (3)图信息更改; (4)图信息删除; (5)图信息查询:按图编号查询、按名查询、按作者名查询; (6)图信息全部显示; (7)图信息全部删除; (8)退出图维护界面。 2、读者维护 (1)设置管理账号和密码; (2)读者信息录入:读者姓名、学号; (3)读者信息更改; (4)读者信息删除; (5)读者信息查询:按读者编号查询、按读者姓名查询; (6)读者信息全部显示; (7)读者信息全部删除; (8)退出读者维护界面。 3、借 (1)设置借的范围(如5本); (2)图数量随着借的数量减少; (3)输入读者编号与图编号后借成功。 4、还 (1)图数量随着还的数量增加; (2)输入读者编号与图编号后还成功。 5、添加功能 (1)添加一本图的基本信息,包括名、图编号、作者名、类别、图数量。 (2)添加读者信息: 添加图借阅的基本信息,包括名、学号。 6、更改功能 对图和读者的信息进行修改。 7、查找功能 (1)图信息查找; (2)读者信息查找。 8、显示功能 (1)显示所有图信息; (2)显示所有借阅信息。 9、删除功能 (1)删除图的基本信息; (2)删除读者的基本信息; (3)删除图借阅基本信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值