15、中间数

问题描述

  在一个整数序列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。

解题思路:这道题比较简单,寻找是否存在有一个中间数,使得大于它和小于它的数一样多。先将数组进行排序,有利于寻找中间数,我使用的是选择排序。之后按照数组的个数为奇数还是偶数进行分类讨论即可。

具体代码:

 1 #include<stdio.h>
 2 void sort(int *number, int n){
 3      int i, j, k,temp;
 4      for (i = 0; i < n - 1; i++){
 5            k = i;
 6            for (j = i + 1; j < n; j++){
 7                 if (*(number + j) < *(number + k))
 8                      k = j;
 9            }
10            temp = *(number + k);
11            *(number + k) = *(number + i);
12            *(number + i) = temp;
13      }
14 }
15
16 int main(){
17      int n,i,j,num[1000];
18      scanf("%d", &n);
19      for (i = 0; i < n; i++)
20            scanf("%d", &num[i]);
21      sort(num, n);
22      int low, high,middle,flag;
23      low = high =flag= 0;
24      middle = (n - 1) / 2;
25      if (n % 2 == 1){
26            for (j = 0; j < middle; j++){
27                 if (num[j] != num[middle])
28                      low++;
29            }
30            for (j = middle + 1; j < n; j++){
31                 if (num[j] != num[middle])
32                      high++;
33            }
34            if (low == high)
35                 flag = 1;
36      }
37      else{
38            if (num[middle] == num[middle + 1]){
39                 for (j = 0; j < middle; j++){
40                      if (num[j] != num[middle])
41                            low++;
42                 }
43                 for (j = middle + 2; j < n; j++){
44                      if (num[j] != num[middle])
45                            high++;
46                 }
47                 if (low == high)
48                      flag = 1;
49            }
50      }
51      if (flag == 1)
52            printf("%d\n", num[middle]);
53      else
54            printf("-1\n");
55      return 0;
56 }

做题感悟:这道题应该属于CCF中送分的题目,到时候考试的时候一定拿下。

时间: 2024-12-20 21:28:27

15、中间数的相关文章

C/C++算法竞赛入门经典Page11 例题1-5 三整数排序

题目:输入3个整数,从小到大排序后输出 样例输入: 20 7 33 样例输出: 7 20 33 首先,先声明三个整数a,b,c和一个临时变量t: int a,b,c,t;//1,b,c为三个整数,t为临时变量 输入三个整数: scanf("%d%d%d",&a,&b,&c); 进行3次if判断: 1.如果b>a,则a,b对调 2.如果c>a,则a,c对调 3.如果c>b,则b,c对调 代码: if(b>=a){ t=b; b=a; a=t

1056. 组合数的和(15)

给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字.要求所有可能组合出来的2位数字的和.例如给定2.5.8,则可以组合出:25.28.52.58.82.85,它们的和为330. 输入格式: 输入在一行中先给出N(1<N<10),随后是N个不同的非0个位数字.数字间以空格分隔. 输出格式: 输出所有可能组合出来的2位数字的和. 输入样例: 3 2 8 5 输出样例: 330 code: 1 #include <stdio.h> 2 3 int main() 4 {

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 B

<神无月>作为盛大游戏2017年的全新原创大作,其开发团队在自研实力强大的传世工作室基础之上,还有美树本晴彦等日本一线知名画师及日本游戏音乐大师崎元仁加盟参与制作.目前正在不限号内测中,有很多玩家进入到神无月的世界中. 在神无月中,有着玩家之间切磋的排位赛,其段位主要分为五大段位,从低到高依次为:新兵.菁英.战将.统帅.王者.每个玩家只有从新兵段位慢慢努力,一点点晋级才能到达王者段位.成为一个王者是每一个玩家的追求和心愿. 假设神无月的段位系统如下: 从低到高的段位依次简记为:D.C.B.A.

java第15章示例代码

import java.util.Scanner; /** * * @author asus第15章示例代码1 全桂群2017.4.9 * */public class Registter { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String uname, pw

Java并发程序设计(15)并发锁之读写锁(续二)写锁降级

1.1.1. 读写锁应用之三写锁降级 ReentrantReadWriteLock还具有写锁降级的特点,而这跟可重入性有一些关系. (1)持有写锁时可以降级为读锁. (2)持有读锁时不能升级为写锁. ReentrantReadWriteLock和ReentrantLock相似的是都有一个特点,就是可重入.可重入指已经获取到锁的线程可以再次获取锁,保证lock和unlock的次数相同即可. package com.test.concurrence; import java.util.Random;

log4j的1.2.15版本,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:jar:1.1 from https://maven-repository.dev.java.net/nonav/repository......

在动态网站工程中,添加了Pom依赖,当添加log4j的1.2.15版本依赖时,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:jar:1.1 from https://maven-repository.dev.java.net/nonav/repository......,如下图 这是因为 https://maven-repository.dev.java.net/nonav/repository 这个域名已经无法解析了. 而

java 19 -15 File类批量更改文件名的方法

1 /* 2 需求: * 把H:\三国演义下面的视频名称修改为 3 00?_介绍.avi 4 5 思路: 6 A:封装目录 7 B:获取该目录下所有的文件的File数组 8 C:遍历该File数组,得到每一个File对象 9 D:拼接一个新的名称,然后重命名即可. 10 */ 11 package zl_file; 12 13 import java.io.File; 14 public class FileTest3 { 15 16 public static void main(String

Linux 第15天: (08月29日) Linux高级文件系统管理

本章内容设定文件系统配额设定和管理软RAID设备配置逻辑卷设定LVM快照btrfs文件系统 配置配额系统综述在内核中执行以文件系统为单位启用对不同组或者用户的策略不同根据块或者节点进行限制执行软限制(soft limit)硬限制(hard limit)初始化分区挂载选项:usrquota.grpquota初始化数据库:quotacheck 为用户设定配额执行开启或者取消配额:quotaon.quotaoff直接编辑配额:edquota username在shell中直接编辑:setquota u

TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)

注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): TControl = class(TComponent) private // 15个私有消息处理,大多是鼠标消息.注意,消息函数大多只是一个中介,且TWinControl并不重写. procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; procedure WMLButtonDown(var Messa