使用map容器时:
算法思想:
比较容易想到先排序,找到排序后的中间数,
数出其左右各有多少数,若相等,则输出中间数,不等,则输出-1.
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<int, int> m;
int n, v;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> v;
m[v]++;
}
// 找出中间数
int ans, mid = (n + 1) / 2, count = 0, left;
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
if (count + it->second >= mid) {
left = count;
count = 0;
ans = it->first;
}
else
count += it->second;
}
// 输出结果
if (left == count)
cout << ans << endl;
else
cout << -1 << endl;
system("pause");
return 0;
}
未使用map容器时:做法比较复杂
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[1000] = { 0 };
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int max[1000] = { 0 }, min[1000] = {0};
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if(a[j] < a[i]) max[i]++;
else
if(a[j] > a[i]) min[i]++;
}
}
int count = 0;
int save[1000] = { 0 };
for (int i = 0; i < n; i++)
{
if (max[i] == min[i])
{
save[i]=a[i];
count++;
}
}
// 去掉数组中重复的数
for (int i = 0; i<n; i++) {
for (int j = i + 1; j<n; j++) {
if (save[i] == save[j]) {
for (int k = j + 1; k<n; k++) {
save[k - 1] = save[k];
}
n--;
j--;
}
}
}
for (int i = 0; i < n; i++)
{
if(save[i]!=0)
cout << save[i] << endl;
}
if (count == 0) cout << "-1" << endl;
system("pause");
return 0;
}
CCF提交后,以上两种做法都是满分。