#IOI20001C. 中等硬度
中等硬度
Description
一个新的实验将要研究 N 个物体,它们的编号从 1 到 N。已知 N 是一个奇数。所 有物体的硬度值都未知,且不同物体的硬度值各不相同。硬度值 Y 是一个自然数,且 1≤Y≤ N。其中有一个物体 X,硬度大于 X 的物体的个数和硬度小于 X 的物体的个数相 等,该物体被称为中等硬度物体。你的任务是写一个程序,找出这个中等硬度物体。不 幸的是,比较物体硬度的唯一方法是使用一种仪器。只要将三个不同的物体放入仪器, 仪器就会检测并返回这三个物体中的中等硬度物体。
库
你将得到一个名为 device 的库,其中包含三个函数:
z GetN,仅在程序开始时调用一次,没有参数:它的返回值是物体的个数 N。
z Med3,调用时将三个不同物体的编号作为参数,返回这三个物体中的中等硬度 物体的编号。
z Answer,仅在你的程序结束时调用,参数是你所找到的那个中等硬度物体 X 的 编号。调用这个函数后,你的程序将结束运行。
库 device 将产生两个文本文件:MEDIAN.OUT 和 MEDIAN.LOG。
MEDIAN.OUT 的第一行包含一个整数:你的程序通过调用库中的函数 Answer 所传 递的中等硬度物体的编号。第二行包含一个整数:你的程序在运行过程中调用 Med3 函 数的次数。
你的程序和库之间的对话过程将被记录在文件 MEDIAN.LOG 中。
a) Pascal
请在源代码中插入语句:
uses device;
b) C/C++ │
#include “device.h” 。
建立一个名为 MEDIAN.PRJ 的工程并且将你的 MEDIAN.C(或 MEDIAN.CPP)和 DEVICE.OBJ 加到该工程中。
试验
你可以通过建立文本文件 DEVICE.IN 来试验所给的库。该文件包含两行。第一行是 一个正整数:物体的个数 N。第二行是一个由整数 1 到 N 组成的序列 :其中第 i 个整数 表示编号为 i 的物体的硬度。
样例
52 5 4 3 1 |
---|
上面的文件 LabelStrength | DEVICE.IN ││了如下所示的五个物体和它们的硬度: 1 2 3 4 52 5 4 3 1 |
---|
下面是一个顺序调用五次函数的正确例子:
-
GetN (在 Pascal 中)或 GetN() (在 C/C++中) 返回 5。
-
Med3(1,2,3) 返回 3。
-
Med3(3,4,1) 返回 4。
-
Med3(4,2,5) 返回 4。
-
Answer(4)
z 对于物体数目 N ,5≤ N≤ 1499,且 N 是奇数。
z 对于物体编号 i ,1≤i≤N。
z 对于物体硬度 Y ,1≤Y≤ N ,不同物体硬度互异。
z Pascal 语言的库文件名为 device.tpu。
z Pascal 函数和过程的声明: function GetN: integer;
function Med3(x, y, z : integer) : integer;
procedure Answer(m : integer);
z C/C++语言的库文件名为 device.h 和 device.obj(使用 large memory 模式)
z C/C++函数头:
int GetN(void);
int Med3(int x, int y, int z);
void Answer(int m);
z 每次运行程序时,调用 Med3 函数的次数不能超过 7777 次。
z 你的程序不能对任何文件进行读写操作。