贪心——牛牛的排序

39 篇文章 1 订阅

贪心——牛牛的排序

题目描述

牛牛刚学完排序,他准备拿n个数一展身手,但是他发现现实中的排序与课堂里的排序不一样。

每次他只能对连续的n-1个数进行从小到大的排序。
请问牛牛最少需要几次排序能将所有的数排成有序的。

输入描述

第一行先输入一个整数n (3 ≤ ≤ 50)。
第二行输入n个整数范围在1到1000以内。

输出描述

输出一个整数。

示例1

输入

4
2 6 8 5

输出

1

示例2

输入

6
4 3 1 6 2 5

输出

2

示例3

输入

5
50 20 30 40 10

输出

3

备注:

子任务1:n <= 10
子任务2:n <= 20
子任务3:无限制

分析

这个题要分四种情况考虑
1.输入的数本来就已经排好序了,那么就不需要排序了,输出0。
2.当输入的第一个数是最小或者最后一个数是最大时,那么最少需要1次排序。
3.当输入的第一个数是最大和最后一个数是最小时,最少需要3次排序。
4.其他情况则至少需要2次排序。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
int a[101],b[101];
int main()
{
	cin>>n;
	int min=1000,max=-1000;
	for(int i=0;i<n;i++){
		cin>>a[i];
		b[i]=a[i];
		if(min>a[i]){
			min=a[i];
		}
		if(max<a[i]){
			max=a[i];
		}
	}
	sort(b,b+n);
	int flag=0;
	for(int i=0;i<n;i++){
		if(a[i]!=b[i]){
			flag=1;
			break;
		}
	}
	if(flag==0){
		cout<<0<<endl;
	}
	else{
		if(a[0]==min||a[n-1]==max){
			cout<<1<<endl;
		}
		else if(a[0]==max&&a[n-1]==min){
			cout<<3<<endl;
		}
		else{
			cout<<2<<endl;
		}
	}
	return 0;
}
贪心算法是一种问题求解方法,它在每一步总是做出当前情况下的最优选择,以期望获得最优解。而"最大整数"同样可以使用贪心算法来求解。 对于"最大整数"的问题,我们可以考虑如下的贪心策略:从高位开始,尽可能选择较大的数字。具体步骤如下: 1. 对于给定的整数,我们首先将其转化为一个数组,其中每个元素表示整数的一个位数。 2. 从最高位(最左侧)开始,遍历数组。 3. 对于当前位上的数字,从9开始递减,找到第一个小于等于当前数字的最大数字。 4. 如果找到了符合条件的最大数字,将其放在当前位。否则,不做任何操作。 5. 继续向下遍历,重复步骤3-4。 6. 最终,得到的数组即为满足条件的最大整数。 以一个具体的例子说明上述算法:假设给定的整数为5372。 1. 将整数转化为数组[5, 3, 7, 2]。 2. 从最高位开始遍历。 3. 对于第一位5,从9开始递减,找到第一个小于等于5的数字,为7。 4. 将7放在第一位,得到[7, 3, 7, 2]。 5. 对于第二位3,从9开始递减,找到第一个小于等于3的数字,为3(与当前数字相等)。 6. 不做任何操作,得到[7, 3, 7, 2]。 7. 对于第三位7,从9开始递减,找到第一个小于等于7的数字,为7。 8. 将7放在第三位,得到[7, 3, 7, 2]。 9. 对于第四位2,从9开始递减,找到第一个小于等于2的数字,为2。 10. 将2放在第四位,得到[7, 3, 7, 2]。 11. 遍历结束,最终得到的数组为[7, 3, 7, 2],转化为整数为7372。 通过上述贪心算法,我们得到了满足条件的最大整数7372。证明了贪心算法在"最大整数"问题中的有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值