QHU丈量小分队

文章目录


题目描述
QHU有一个1–>n的排列,现在有一次机会可以交换两个数的位重,求交换后最小值和最大值之间的最大距离是多少?
输入
第一行1个数n(n<=200000)
之后一行n个数表示这个排列
输出
输出一行一个数表示答案
样例输入
5
4 5 1 3 2
样例输出
3
提示
把1和2交换后
序列为4 5 2 3 1
最大值5在数组的2位置,最小值1在数组的5位置
距离为3

#include<stdio.h>//输入输出头文件
#include<assert.h>//assert头文件
#include<stdlib.h>//malloc头文件
int main()
{
	int pos_min = 0;//最小值下标
	int pos_max = 0;//最大值下标
	int n = 0;//数据个数
	int k = scanf("%d", &n);
	//动态内存开辟
	int* p = (int*)malloc(sizeof(int) * n);
	//暴力检查(空间申请是否成功)
	assert(p);

	//循环输入所有数据
	for (int i = 0; i < n; i++)
	{
		k = scanf("%d", &p[i]);
	}

	//找最小值下标
	for (int i = 0; i < n-1; i++)
	{

		if (p[pos_min] > p[i + 1])
		{
			int tmp = i + 1;//此处必须用变量接受下标之后再赋值
			pos_min = tmp;//若直接赋值,会因后续循环中i的值在发生变化而导致pos_min变化
		}
	}

	//找最大值下标
	for (int i = 0; i < n - 1; i++)
	{

		if (p[pos_max] < p[i + 1])
		{
			int tmp = i + 1;//此处必须用变量接受下标之后再赋值
			pos_max = tmp;//若直接赋值,会因后续循环中i的值在发生变化而导致pos_max变化
		}
	}

	//判断最大值与最小值的相对位置
	int Numleft = (pos_max > pos_min ? pos_min : pos_max);
	int Numright = (pos_max > pos_min ? pos_max : pos_min);

	//两个距离
	int Distance1 = (n - 1) - Numleft;
	int Distance2 = Numright;
	//找最大距离
	int Distance = (Distance2 > Distance1 ? Distance2 : Distance1);
	//打印最大距离
	printf("%d\n", Distance);
	return 0;
}

多有不足之处,还请批评指正

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值