ccf-201612-1-中间数

试题编号: 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。

解题思路:先进行排序,然后看最中间的数字。
如果n是奇数的话,那么计数sum1统计值和最中间数字相等的次数,如果次数是奇数,那么说明存在中间数,如果不是奇数,那么就没有中间数。
如果n是偶数的话,先比较最中间的数字是不是一样的,如果不一样那么就没有中间数,如果一样那么计数sum统计值和最中间那两个数一样的次数,如果这个次数是偶数则存在中间数,如果是奇数则没有。

#include <iostream>
using namespace std;
int main()
{    
    int n;
    int a[1010];
    cin>>n;
    for(int i=0;i<n;i++)
       cin>>a[i];
    //排序
    for(int i=0;i<n-1;i++)
       for(int j=1;j<n-1-i;j++)
           if(a[j]<a[j+1])
           {  
              int temp=a[j];
              a[j]=a[j+1];
              a[j+1]=temp;
           }
    //进行比较
    int mid=n/2;
    if(n%2!=0)
    {   
            int sum1=0;
            for(int i=0;i<n;i++)
          	{
    		if(a[i]==a[mid])
    		sum1++;
        	}
    		if(sum1%2!=0)
    		cout<<a[mid];
    		else
    		cout<<-1;
    }
    if(n%2==0)
    {   
	    int sum=0;
    	if(a[mid]!=a[mid-1])
    	cout<<-1;
    	else
    	{
    		for(int i=0;i<n;i++)
         	{
    		
    		if(a[i]==a[mid])
    		sum++;
        	}
        	if(sum%2==0)cout<<a[mid];
        	else cout<<-1;
    	}  	
    }
    
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_41318400/article/details/89182618