#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

下面是一个顺序调用五次函数的正确例子:

  1. GetN  (在 Pascal 中)或 GetN()  (在 C/C++中)            返回 5。
    
  2. Med3(1,2,3)                                                                     返回 3。
    
  3. Med3(3,4,1)                                                                     返回 4。
    
  4. Med3(4,2,5)                                                                     返回 4。
    
  5. 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 你的程序不能对任何文件进行读写操作。