您的位置:首页 > 其它

CCF CSP 中间数

2017-08-12 23:58 323 查看

CCF CSP 中间数

题目

问题描述

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

答题栏

试题编号:201612-1
试题名称:中间数
编译环境:
答案程序:
提交确认:以下必须全部满足才能提交:

我的程序没有使用package语句来定义包的信息。(如果定义了将无法评测)

我的程序的主类名称是Main,主类的定义是public class Main。我的程序运行的入口是主类Main中的main函数,定义为public static void main(String[] args)。

没有引用stdafx.h这个非标准的头文件。(如果引用了会造成编译错误)

我程序的运行入口函数是main,main的返回值类型是int,而且main的返回值始终是0。

我的程序是从标准输入(System.in)中读入数据的(使用Scanner等类来处理System.in的输入视为满足条件),结果是输出到标准输出(System.out)的。

我的程序是从标准输入中读入数据的(使用cin/scanf等读入),结果是输出到标准输出的(使用cout/printf等读出)。

我的程序中没有“请输入n”之类的输入输出提示,也没有输出中间的结果,所有的输出内容都与题设中的输出格式相对应。我的输出格式(包括换行和大小写等)与题设中输出格式的要求相符。

思路

箱排序,然后从左右两边同时开始扫描即可

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn(1e3 + 10);
int array[maxn];
int n;
int cnt;
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF){
memset(array,0,sizeof(array));
cnt = 0;
int ai;
int left = 1000, right = 0;
for(int i = 0; i < n; i++){
scanf("%d",&ai);
if(array[ai] == 0){
cnt++;
}
array[ai]++;
left = min(left, ai);
right = max(right, ai);
}
left--;
right++;
int sum1 = 0, sum2 = 0;
bool found = false;
while(left < right && !found && cnt){
if(sum1 == sum2){
if(cnt != 1){
do{
left++;
if(array[left]){
sum1 += array[left];
cnt--;
}
}while(!array[left] && left < right);
}
else{
for(int i = left + 1; i < right; i++){
if(array[i]){
printf("%d\n", i);
found = true;
break;
}
}
}
}
else{
if(sum1 < sum2){
do{
left++;
if(array[left]){
sum1 += array[left];
cnt--;
}
}while(!array[left] && left < right);
}
else{
do{
right--;
if(array[right]){
sum2 += array[right];
cnt--;
}
}while(!array[right] && left < right);
}
}
}
if(!found){
puts("-1");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  箱排序