试题编号: 201612-1
试题名称: 中间数
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
给定一个整数序列,请找出这个整数序列的中间数的值。
输入格式
输入的第一行包含了一个整数n,表示整数序列中数的个数。
第二行包含n个正整数,依次表示a1, a2, …, an。
输出格式
如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。
样例输入
6
2 6 5 6 3 5
样例输出
5
样例说明
比5小的数有2个,比5大的数也有2个。
样例输入
4
3 4 6 7
样例输出
-1
样例说明
在序列中的4个数都不满足中间数的定义。
样例输入
5
3 4 6 6 7
样例输出
-1
样例说明
在序列中的5个数都不满足中间数的定义。
评测用例规模与约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ ai ≤ 1000。
——————————————————————————————————
写了一个暴力过了,
然后看群主的代码,感觉自己就是头🐖
还是要好好学习STL的X):
equal_range 函数整体上来讲就是lower_bound 和upper_bound 的整合版
在本例中使用最合适不过了
下面是AC的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 5;
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
int main()
{
int n;
cin >> n;
vector<int> a;
for (int i = 0; i < n; ++i)
cin>>a[i];
sort(a.begin(), a.end());
auto it = equal_range(a.begin(), a.end(), a[a.size() / 2]); //利用equal_range函数从已排序的数组中二分查找a[a.size() / 2]
if (it.first - a.begin() == a.end() - it.second) //如果左==右,及成立
printf("%d", a[a.size() / 2]);
else //否则输出-1
printf("-1");
return 0;
}
相关链接:
equal_range
是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)
中寻找value
,它返回一对迭代器i
和j
,其中i是在不破坏次序的前提下,value
可插入的第一个位置(亦即lower_bound
),j则是在不破坏次序的前提下,value
可插入的最后一个位置(亦即upper_bound
),因此,[i,j)
内的每个元素都等同于value
,而且[i,j)
是[first,last)
之中符合此一性质的最大子区间
如果以稍许不同的角度来思考equal_range,
我们可把它想成是[first,last)
内"与value等同"之所有元素形成的区间A,由于[fist,last)
有序(sorted
),所以我们知道"与value等同"之所有元素一定都相邻,于是,算法lower_bound返回区间A的第一个迭代器,算法upper_bound返回区间A的最后一个元素的下一个位置,算法equal_range则是以pair的形式将两者都返回
即使[fist,last)并未含有"与value等同"之任何元素,以上叙述仍然合理,这种情况下,"与value等同"之所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二(都是迭代器)皆指向该位置。