QOJ.ac

QOJ

时间限制: 1 s 内存限制: 32 MB 总分: 100 交互

#599. 搜寻

统计

年轻且疯狂相爱的 Bajtek 和 Bajtyna 陷入了困境。邪恶的巫师 Bitocy 绑架了 Bajtyna,希望能勒索一笔巨额赎金。然而,Bajtek 并没有放弃——他虽然并不富有,但决定救出他的爱人。Bitocy 不喜欢肉搏,因此他提出了另一种解决方式:如果这位年轻人能猜出 Bajtyna 被关在塔的哪一层,巫师就会放她走。

塔楼有很多层,编号从 $1$ 到 $n$。Bajtek 唯一的帮助是向巫师提问。问题必须是“Bajtyna 是否在 $x$ 层之上/之下?”的形式。当然,Bajtek 可以选择“之上”或“之下”中的任意一个词,并自由设定数字 $x$。Bitocy 总是如实回答,但如果回答为“是”,他会要求支付 $a$ 个 bajtalar,如果回答为“否”,则要求支付 $b$ 个 bajtalar。如果 Bajtek 变得太穷,而 Bitocy 变得太富有,Bajtyna 可能就会选择留在巫师那里……

Bajtek 正在思考该问什么问题。不幸的是,Bajtyna 能听到所有的对话,即 Bajtek 的连续提问和 Bitocy 的回答,而且她是一个非常节俭的人。如果 Bajtek 花费的钱超过了(在最坏情况下)确定她位置所需的最小金额,她就会对他感到非常失望,并与 Bitocy 一起离开。更准确地说,如果在对话的某个时刻,可以推断出从那一刻起,无论 Bitocy 后续如何回答,Bajtek 都能以不超过 $K$ 个 bajtalar 的花费猜出 Bajtyna 的位置,而从那一刻起 Bajtek 花费的金额超过了 $K$,那么他在 Bajtyna 心中的好感度将降为零(该测试点不得分)。请帮助 Bajtek!

交互

你需要实现一个程序,利用提供的库(模拟巫师 Bitocy)来解决 Bajtek 的问题。要在程序中使用该库,必须包含:

  • C/C++: #include "poslib.h"
  • Pascal: uses poslib;

该库提供以下三个过程和函数:

  • inicjuj — 提供楼层数 $n$ 以及费用 $a$ 和 $b$。该函数应在程序开始时恰好调用一次。
    • C/C++: void inicjuj(int *n, int *a, int *b);
    • Pascal: procedure inicjuj(var n, a, b: longint);
  • pytaj — 字符 $c$ 表示问题类型('W' 表示“之上”,'N' 表示“之下”),$x$ 是楼层编号。函数返回巫师回答的逻辑值。你的程序可以任意多次调用此函数。
    • C/C++: int pytaj(char c, int x); (0 表示假,1 表示真)
    • Pascal: function pytaj(c: char; x: longint): boolean;
  • odpowiedz — 使用此过程/函数给出 Bajtyna 所在的楼层编号。该函数应恰好调用一次,调用后程序将结束。
    • C/C++: void odpowiedz(int wynik);
    • Pascal: procedure odpowiedz(wynik: longint);

你的程序不能打开任何文件,也不能使用标准输入输出。解决方案将与库一起编译,命令如下:

  • C: gcc -O2 -static poslib.c pos.c -lm
  • C++: g++ -O2 -static poslib.c pos.cpp -lm
  • Pascal: ppc386 -O2 -XS -Xt pos.pas

/home/zawodnik/rozw/lib 目录下,你可以找到示例库文件和说明其使用方法的非最优解。为了使上述编译命令生效,库文件应位于当前目录下。

数据范围

你可以假设 $1 \leqslant n \leqslant 10^9$ 且 $1 \leqslant a, b \leqslant 10\,000$。

样例

样例 1

调用函数 返回值与说明
Pascal: inicjuj(n,a,b);
C 或 C++: inicjuj(&n,&a,&b);
从此刻起 $n = 5, a = 1, b = 2$。
pytaj('W',3); 结果为 0/false。询问 Bajtyna 是否在 3 层之上。得到回答“否”。支付 2 个 bajtalar。
pytaj('N',2); 结果为 0/false。询问是否在 2 层之下。得到回答“否”,支付 2 个 bajtalar。
pytaj('W',2); 结果为 1/true。询问是否在 2 层之上。得到回答“是”,支付 1 个 bajtalar。
odpowiedz(3); 回答 Bajtyna 在 3 层。这是正确答案。总共花费 5 个 bajtalar。

上述交互过程是正确的,但不是最优的,因此程序无法在该测试中得分。特别地,一个编写良好的程序对于 $n = 5, a = 1, b = 2$ 的数据,能够通过提问确保在任何情况下花费不超过 4 个 bajtalar。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.