您的位置:首页 > 其它

牛客练习赛11 D-求距离

2018-01-27 14:03 246 查看
时间限制:C/C++ 1s,其他语言2s空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld

题目描述

给你一个1 -> n的排列,现在有一次机会可以交换两个数的位置,求交换后最小值和最大值之间的最大距离是多少?

输入描述:

第一行一个数n
之后一行n个数表示这个排列

输出描述:

输出一行一个数表示答案
解题思路:用的二分法,很简单
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
int n;
int a[105], b[105];
int ma, mi;
int max(int a, int b)
{
if (a >= b) return a;
else return b;
}
int min(int a, int b)
{
if (a <= b) return a;
else return b;
}
void search()
{
int l = 1;
int r = n+1;
int mid;
int ans;
while (r - l >= 1)
{
mid = (l + r) / 2;
if (b[ma] + mid <= n || b[ma] - mid >= 1 || b[mi] + mid <= n || b[mi] - mid >= 1)
{
ans = mid;
l = mid+1;
}
else
{
r = mid;
}
}
printf("%d\n", ans);
}
int main()
{
while (~scanf("%d", &n))
{
mi = 300;
ma = -1;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
b[a[i]] = i;
mi = min(mi, a[i]);
ma = max(ma, a[i]);
}
search();
}
return 0;
}
有问题欢迎私聊评论,么么哒~时间比较紧,只写了这一个题

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息