文章目录
题目描述
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;
}
多有不足之处,还请批评指正