P15512 [CEOI 2006] Meandian 中位数均值

题目背景

**仅支持 C++ 交互,请不要使用 C++14 (GCC 9)。** 你不需要引入额外的头文件,但请在代码开头添加如下声明: ```cpp int Init(); int Meandian(int a,int b,int c,int d); void Solution(const int * a); ```

题目描述

某些公司喜欢对员工薪资保密,以防止工会领导得知员工的薪资过低,从而避免关于加薪和奖金的繁琐谈判。然而,有时公司也乐于发布某些信息用于统计和营销目的。 一家特别的公司愿意回答以下形式的问题:"员工 $A,B,C$ 和 $D$ 的薪资的中位数均值是多少?" 四个数的“**中位数均值**”定义为两个中位数的算术平均值。更确切地说,序列 $a,b,c,d$ 的中位数均值是通过先对序列排序,然后计算 $(x+y)/2$ 得到的,其中 $x$ 和 $y$ 是排序后序列中的第二个和第三个元素。你的目标是通过提出一系列此类问题,找出确切的薪资。请注意,某些员工的薪资可能永远无法被推断出来(例如,薪资最低的员工),即使你问遍了所有问题。 公司有 $N(4 \le N \le 100)$ 名员工,编号为 $1$ 到 $N$。每位员工的薪资是一个小于或等于 $100,000$ 的**正偶数**,**且没有两名员工的薪资相同**。 你会获得一个实现了 `Meandian` 函数的库。给定四个**不同**的整数 $A,B,C,D(1 \le A, B, C, D \le N)$,此函数返回员工 $A,B,C,D$ 薪资的中位数均值。 编写一个程序(包含 `main` 函数),找出**所有薪资的确切值**,除了那些永远无法确定的薪资。**你的程序最多允许提出 $1000$ 个问题**。 ### 库 你可以以下三个库函数: - `int Init()`:调用时无需参数。此函数应当且仅当在你的程序开始时调用一次。它不接受参数,并返回整数 $N$(公司员工数)。 - `int Meandian(int,int,int,int);`:此函数应以四个参数 $A,B,C,D$ 调用,它们是 $1$ 到 $N$(包含)之间的不同整数。它返回一个整数,即员工 $A,B,C,D$ 薪资的中位数均值。 - `void Solution(const int *);`:此函数应在你的程序结束时调用。它接受一个整数数组作为参数,表示对应员工的薪资。如果某个特定员工的薪资无法确定,数组中的对应值应为 $-1$。 **注意**:传入的数组应是 0-index 的。这意味着员工 $1$ 的薪资应位于数组的位置 $0$,员工 $2$ 的薪资位于位置 $1$,依此类推。

输入格式

输出格式

说明/提示

### 测试 提供的示例库允许你通过标准输入输入数字 $N$,后跟 $N$ 个偶数来测试你的解决方案。 库将输出一条消息,指示你的解决方案是否正确。它还将创建一个文本文件 `meandian.log`,包含程序执行的详细信息。 以下是完全不解决问题的代码片段,但作为使用库的示例。 ```cpp int Init(); int Meandian(int a,int b,int c,int d); void Solution(const int * a); int main(void) { int i, n; int arr[100]; int foo, bar, quux; n = Init(); foo = Meandian(1, 2, 3, 4); bar = Meandian(4, 2, 3, 1); quux = Meandian(n, n-1, n-2, n-3); for (i=1; i