本期正中:猜一数。

4178人阅读
CCF-CSP题解(56)
数列与序列处理(33)
试题编号:
试题名称:
时间限制:
内存限制:
问题描述:
  在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
  给定一个整数序列,请找出这个整数序列的中间数的值。
输入格式
  输入的第一行包含了一个整数n,表示整数序列中数的个数。
  第二行包含n个正整数,依次表示a1, a2, …, an。
输出格式
  如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。
2 6 5 6 3 5
  比5小的数有2个,比5大的数也有2个。
  在序列中的4个数都不满足中间数的定义。
  在序列中的5个数都不满足中间数的定义。
评测用例规模与约定
  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ ai&≤ 1000。
问题链接:。
问题描述:首先输入正整数n,接着输入n个正整数,如果存在一个数,比该数大或比该数小的数则输出该数,如果不存在则输出-1。
问题分析:这个问题可以用排序来解决,这是基础。可以证明,如果存在答案则必定所有数排序后的中间位置。
排序方法上有以下几种:
1.对n个数进行排序,找出中间那个数,然后将中间那个数的左右与其相等的数去掉,看左右剩下的数个数是否相等,如果相等则中间那个数就是答案,否在输出-1。
2.使用分治法,按照快速排序的基本思想来处理,只需要将中间的那个数找到即可。
3.使用STL的map类对数据进行排序。这种方法在同值的数据比较多时候,存储上会节省一些。
4.按照桶排序的基本思想,将相同的值放入同一个桶中,即对同值数据进行计数,然后再计算中间值。
程序说明:本程序采用上述的第1种方法实现。STL的algorithm中封装了许多算法,排序函数sort()其中之一,使用起来非常简单。
使用函数lower_bound()和upper_bound()来实现的话,代码会更加简单,后文也给出了这种版本的代码。数据必须在排序之后才能使用这两个函数。
提交后得100分的程序如下:
/* CCF 中间数 */
#include &iostream&
#include &algorithm&
const int N = 1000;
int val[N];
int main()
int n, mid, leftcount,
// 输入数据
for(int i=0; i&n; i++)
cin && val[i];
sort(val, val+n);
// 找出中间数
mid = n / 2;
leftcount =
rightcount = n - mid - 1;
// 去掉左边与中间相同值数的个数
for(int i=mid-1; i&=0; i--)
if(val[i] == val[mid])
leftcount--;
// 去掉右边与中间相同值数的个数
for(int i=mid+1; i&n; i++)
if(val[i] == val[mid])
rightcount--;
// 输出结果
if(leftcount == rightcount)
cout && val[mid] &&
cout && -1 &&
使用函数lower_bound()和upper_bound()的版本,提交后得100分的程序如下:
/* CCF 中间数 */
#include &iostream&
#include &algorithm&
const int N = 1000;
int val[N];
int main()
// 输入数据
for(int i=0; i&n; i++)
cin && val[i];
sort(val, val+n);
// 找出中间数
int mid = val[n / 2];
int lb = lower_bound(val, val + n, mid) -
int ub = upper_bound(val, val + n, mid) -
// 输出结果
if(n - ub == lb)
cout && mid &&
cout && -1 &&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:826566次
积分:19015
积分:19015
排名:第525名
原创:1017篇
转载:81篇
评论:375条
文章:19篇
阅读:7106
文章:39篇
阅读:13838
文章:54篇
阅读:112095
文章:15篇
阅读:12638
文章:14篇
阅读:17274
文章:40篇
阅读:28418
文章:451篇
阅读:322182
(87)(5)(2)(4)(103)(76)(68)(48)(32)(54)(3)(6)(14)(80)(89)(132)(126)(62)(58)(49)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'考试指南:
备考真题:
热门杯赛:
推荐城市:
教师资源:
期中试题:
期末试题:
单元测试:
小学试题:
语文试题:
语文考点:
数学试题:
数学乐园:
英语知识点:
英语试题资源:
您现在的位置: &
二年级趣味数学:猜数游戏
来源:数学智能与培养
  (1)写着1到15各数的卡片按顺序叠在一起。正中间的一张是几?数字卡片1在上面从上往下数第五张是几?从下往上数第五张是几?
  (2)写着1到83各数的卡片按顺序叠在一起。正中间的一张是几?
  (3)写着24到100各数的卡片按顺序叠在一起。正中间的一张是几?数字卡片24在上面从上往下数第十张是几?从下往上数第十张是几?
&参考答案:
  (1)正中间一张是8。从上往下数第五张是5,从下往上数第五张是11。这样想:(15+1)&2=8,正中间一张是8。从上往下数第五张是5,从
  下往上数第五张是15-4=11(数掉四张卡片,看第五张卡片)。
  (2)正中间一张是(83+1)&2=42。
  (3)正中间一张是62。从上往下数第十张是33。从下往上数第十张是91。
  这样想:24到100各数的卡片共100-24+1=77。这77张卡片的正中间卡片是从上数(77+1)&2=39。第39张或从下往上数第39张。第39张这个卡片上的数是24+38=62(从24数,24已占了一张,再数38张就可以了)或者100-38=62(从下往上去掉38张卡片,第39张卡片是正中间卡片)。
  从上往下数第十张是24+9=33(因为24占了一张)从下往上数第十张是100-9=91(因为从下去掉9张卡片,第十张是91)。
欢迎访问奥数网,您还可以通过手机等移动设备查询小学试题库、奥数题库、小升初动态、竞赛辅导、重点中学信息等,2018小升初我们一路相伴。
点击查看更多
24小时热帖每周热帖看图猜成语一颗红色的心中间一个白色的数字是什么_5577我机网
看图猜成语一颗红色的心中间一个白色的数字是什么
16:43:45 来源: 作者:Android
好大一颗红色的心,中间有一个白色的数字,它代表了什么意思呢?小编看见有玩家在问这道题,所以来分享一下答案啦~!它的答案是:心中有数完全是靠字面意思来理解的,连起来答案就出来啦~!所以想复杂了的亲们别桑心,抱一个,带上答案通关吧~!
点击查看更多
疯狂看图猜成语v1.2扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
二五后面一五跟,玄机就此中间猜一数字
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
为您推荐:
其他类似问题
扫描下载二维码看图猜成语一颗红色的心中间一个白色的数字是什么_5577我机网
你的位置: →
→ 看图猜成语一颗红色的心中间一个白色的数字是什么
看图猜成语一颗红色的心中间一个白色的数字是什么
好大一颗红色的心,中间有一个白色的数字,它代表了什么意思呢?小编看见有玩家在问这道题,所以来分享一下答案啦~!它的答案是:心中有数完全是靠字面意思来理解的,连起来答案就出来啦~!所以想复杂了的亲们别桑心,抱一个,带上答案通关吧~!
各位微信看图猜成语的玩家,我机小编将给大家分享的是微信看图猜
好吧,一个穿着黑色衣服粉色嘴唇,嘴角有一粒痣的女人,长头发,
破解修改汉化
推荐手机游戏专区}

我要回帖

更多关于 数学猜想 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信