#P15512. [CEOI 2006] Meandian

    ID: 15386 远端评测题 1000ms 64MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>2006交互题Special JudgeCEOI(中欧)

[CEOI 2006] Meandian

说明

某些公司喜欢对员工薪资保密,以防止工会领导得知员工的薪资过低,从而避免关于加薪和奖金的繁琐谈判。然而,有时公司也乐于发布某些信息用于统计和营销目的。

一家特别的公司愿意回答以下形式的问题:"员工 A,B,CA,B,CDD 的薪资的中位数均值是多少?" 四个数的“中位数均值”定义为两个中位数的算术平均值。更确切地说,序列 a,b,c,da,b,c,d 的中位数均值是通过先对序列排序,然后计算 (x+y)/2(x+y)/2 得到的,其中 xxyy 是排序后序列中的第二个和第三个元素。你的目标是通过提出一系列此类问题,找出确切的薪资。请注意,某些员工的薪资可能永远无法被推断出来(例如,薪资最低的员工),即使你问遍了所有问题。

公司有 N(4N100)N(4 \le N \le 100) 名员工,编号为 11NN。每位员工的薪资是一个小于或等于 100,000100,000正偶数且没有两名员工的薪资相同

你会获得一个实现了 Meandian 函数的库。给定四个不同的整数 A,B,C,D(1A,B,C,DN)A,B,C,D(1 \le A, B, C, D \le N),此函数返回员工 A,B,C,DA,B,C,D 薪资的中位数均值。

编写一个程序(包含 main 函数),找出所有薪资的确切值,除了那些永远无法确定的薪资。你的程序最多允许提出 10001000 个问题

你可以以下三个库函数:

  • int Init():调用时无需参数。此函数应当且仅当在你的程序开始时调用一次。它不接受参数,并返回整数 NN(公司员工数)。
  • int Meandian(int,int,int,int);:此函数应以四个参数 A,B,C,DA,B,C,D 调用,它们是 11NN(包含)之间的不同整数。它返回一个整数,即员工 A,B,C,DA,B,C,D 薪资的中位数均值。
  • void Solution(const int *);:此函数应在你的程序结束时调用。它接受一个整数数组作为参数,表示对应员工的薪资。如果某个特定员工的薪资无法确定,数组中的对应值应为 1-1

注意:传入的数组应是 0-index 的。这意味着员工 11 的薪资应位于数组的位置 00,员工 22 的薪资位于位置 11,依此类推。

10
100 500 200 400 250 300 350 600 550 410

提示

测试

提供的示例库允许你通过标准输入输入数字 NN,后跟 NN 个偶数来测试你的解决方案。

库将输出一条消息,指示你的解决方案是否正确。它还将创建一个文本文件 meandian.log,包含程序执行的详细信息。

以下是完全不解决问题的代码片段,但作为使用库的示例。

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<=n; ++i)
      arr[i-1] = 2*i;
   arr[3] = -1;
   Solution(arr);
   return 0;
}

翻译来源:@0Io_oI0