[noj 1557] Team of Slime

本文介绍了一种通过判断数组中相对无序元素数量来优化排序过程的方法。具体地,对于一个给定长度为n的数组,该算法通过移动元素至数组头部的方式实现排序,并给出了一段C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知道为什么同一组数据要竖着写,这样看起来有点别扭。

题意是:给你一个n,然后给你1~n的一个排列。每次可以挑一个数放到数组的开头,问经过最少多少次这样的操作,可以将这个数列从小到大排好。

样例解释:

2

1 3 2 4

先将2移到开头,变成2 1 3 4,然后将1移到开头,变成1 2 3 4,所以答案是2.

考虑这个样例,为什么一开始移动2呢,因为3和4已经相对有序了,已经整齐了,所以接下来要动还没整齐的2了。这道题是移动到开头,所以移动一个数字以后,改变的是这个数字的相对有序顺序,而不会改变其他数的相对有序顺序。

如2 1 3 4,2 3和4已经相对有序了,接下来只要调整1的相对有序顺序就行了,也就是还差一个数字就有序了,所以答案是1。

再看1 5 2 4 3,相对有序的只有一个5,所以要先移动4,再移动3、2和1。

这样一来题目就很清晰了,从最大的数来看,有几个数相对无序,答案就是几

#include<iostream>
using namespace std;

int num[300005];

int main()
{
	int n;
	while(~scanf("%d", &n))
	{
		int t = n;
		for(int i = 1; i <= n; i++)
			scanf("%d", &num[i]);
		for(int i = n; i; i--)
			if(num[i] == t)t--;
		printf("%d\n", t);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值