#P15512. [CEOI 2006] Meandian
[CEOI 2006] Meandian
说明
某些公司喜欢对员工薪资保密,以防止工会领导得知员工的薪资过低,从而避免关于加薪和奖金的繁琐谈判。然而,有时公司也乐于发布某些信息用于统计和营销目的。
一家特别的公司愿意回答以下形式的问题:"员工 和 的薪资的中位数均值是多少?" 四个数的“中位数均值”定义为两个中位数的算术平均值。更确切地说,序列 的中位数均值是通过先对序列排序,然后计算 得到的,其中 和 是排序后序列中的第二个和第三个元素。你的目标是通过提出一系列此类问题,找出确切的薪资。请注意,某些员工的薪资可能永远无法被推断出来(例如,薪资最低的员工),即使你问遍了所有问题。
公司有 名员工,编号为 到 。每位员工的薪资是一个小于或等于 的正偶数,且没有两名员工的薪资相同。
你会获得一个实现了 Meandian 函数的库。给定四个不同的整数 ,此函数返回员工 薪资的中位数均值。
编写一个程序(包含 main 函数),找出所有薪资的确切值,除了那些永远无法确定的薪资。你的程序最多允许提出 个问题。
库
你可以以下三个库函数:
int Init():调用时无需参数。此函数应当且仅当在你的程序开始时调用一次。它不接受参数,并返回整数 (公司员工数)。int Meandian(int,int,int,int);:此函数应以四个参数 调用,它们是 到 (包含)之间的不同整数。它返回一个整数,即员工 薪资的中位数均值。void Solution(const int *);:此函数应在你的程序结束时调用。它接受一个整数数组作为参数,表示对应员工的薪资。如果某个特定员工的薪资无法确定,数组中的对应值应为 。
注意:传入的数组应是 0-index 的。这意味着员工 的薪资应位于数组的位置 ,员工 的薪资位于位置 ,依此类推。
10
100 500 200 400 250 300 350 600 550 410
提示
测试
提供的示例库允许你通过标准输入输入数字 ,后跟 个偶数来测试你的解决方案。
库将输出一条消息,指示你的解决方案是否正确。它还将创建一个文本文件 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。
京公网安备 11011102002149号