CCF CSP 中间数
题目
试题编号: | 201612-1 |
试题名称: | 中间数 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
在一个整数序列a
1, a
2, …, a
n中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
给定一个整数序列,请找出这个整数序列的中间数的值。
输入格式
输入的第一行包含了一个整数n,表示整数序列中数的个数。
第二行包含n个正整数,依次表示a 1, a 2, …, a n。
输出格式
如果约定序列的中间数存在,则输出中间数的值,否则输出-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 ≤ a
i ≤ 1000。
|
试题编号: | 201612-1 |
试题名称: | 中间数 |
编译环境: | |
答案程序: | |
提交确认: | 以下必须全部满足才能提交:
|
思路
箱排序,然后从左右两边同时开始扫描即可
#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;
}