CSP-201612-1-中间数
解题思路
-
输入和初始化:首先,程序读入一个整数n,表示序列中数的个数。接着,读入n个正整数并存储在
numList
向量中,这些数依次表示a1, a2, …, an。 -
排序:使用
sort
函数对numList
进行升序排序。排序后,相同的数将会被放置在一起,这使得之后的操作更加简单。 -
去重:复制
numList
到numListCopy
,然后使用unique
和erase
方法对numListCopy
去重。unique
函数重排元素,使每个元素只出现一次并返回新的无重复元素序列的结束迭代器,然后erase
函数删除这些重复元素。这样做的目的是为了避免在接下来的计算中重复计算相同的值。 -
查找中间数:遍历去重后的
numListCopy
。对于每个元素it
,初始化两个计数器up
和low
,分别用来统计原序列中大于it
和小于it
的元素数量。然后再次遍历整个numList
,根据每个元素jt
与it
的关系,更新up
和low
的值。 -
判断和输出:如果某个元素
it
满足up == low
,即大于它的数和小于它的数的数量相等,那么这个数就是所求的中间数,输出这个数并结束程序。如果遍历完所有去重后的元素都没有找到这样的数,则输出-1表示不存在中间数。
完整代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int>numList;
int main() {
int n;
cin >> n;
vector<int>numList(n);
for (int i = 0; i < n; i++)
{
cin >> numList[i];
}
sort(numList.begin(), numList.end());
vector<int>numListCopy = numList;
auto last = unique(numListCopy.begin(), numListCopy.end());
numListCopy.erase(last, numListCopy.end());
for (auto& it : numListCopy) {
int up = 0, low = 0;
for (auto& jt : numList) {
if (it > jt)
{
up++;
}
else if (it < jt)
{
low++;
}
}
if (up == low)
{
cout << it;
return 0;
}
}
cout << -1;
return 0;
}