问题描述
在一个整数序列a
1, a
2, …, a
n中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
给定一个整数序列,请找出这个整数序列的中间数的值。
给定一个整数序列,请找出这个整数序列的中间数的值。
输入格式
输入的第一行包含了一个整数n,表示整数序列中数的个数。
第二行包含n个正整数,依次表示a 1, a 2, …, a n。
第二行包含n个正整数,依次表示a 1, a 2, …, a n。
输出格式
如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。
样例输入
6
2 6 5 6 3 5
2 6 5 6 3 5
样例输出
5
样例说明
比5小的数有2个,比5大的数也有2个。
样例输入
4
3 4 6 7
3 4 6 7
样例输出
-1
样例说明
在序列中的4个数都不满足中间数的定义。
样例输入
5
3 4 6 6 7
3 4 6 6 7
样例输出
-1
样例说明
在序列中的5个数都不满足中间数的定义。
评测用例规模与约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ a
i ≤ 1000。
解题思路:首先讲输入的数组按从小到大进行排序,求出中位数,然后将大于中位数的用big_than_middle计数,将小于中位数的用little_than_middle计数,判断两个数的大小,按要求输出结果。
代码如下:(该程序在debian系统下成功运行,在该题所在网站也成功提交正确)
#include<stdio.h>
#include<malloc.h>
int sort(int count,int *array) //采用直接插入算法对数组进行排序
{ /*直接插入排序(straight insertion sort)是一种简单的排序算法,基本思想是将第一个元素当做一个有序的子序列,然后从第二个记录依次进行插入,首先与已经排序好的有序子序列最大的数max进行比较,若大于等于max,则它就在原位置,若小于max,则向前继续与有序自序列max之前的数进行比较,直到找到小于的数的位置,插入该位置,将有序子序列依次向后移动一位*/
int i;
int j;
int e;
for(i=1;i<count;i++)
{
e=array[i];
for(j=i-1;j>=0&&e<array[j];j--)
{
array[j+1]=array[j];
}
array[j+1]=e;
}
}
int result(int *array,int count) //结果返回函数
{
int e;
int middle=count/2;
int i,little_than_middle=0,big_than_middle=0;
for(i=0;i<count;i++)
{
if(array[i]<array[middle])
little_than_middle++;
else if(array[i]>array[middle])
big_than_middle++;
else
;
}
if(little_than_middle==big_than_middle)
return array[middle];
else
return -1;
}
int main(void) //main函数
{
int count;
int *array;
int i;
scanf("%d",&count);
array=(int*)malloc(sizeof(int)*count); //为将要输入的整数申请内存
for(i=0;i<count;i++)
{
scanf("%d",&array[i]);
}
sort(count,array);
printf("%d\n",result(array,count));
free(array); //释放申请内存
return 0;
}