#HK5065. 「POI2017 R3」厨师 Cook
「POI2017 R3」厨师 Cook
题目描述
题目译自 XXIV Olimpiada Informatyczna — III etap Kucharz
厨师 Bajtazar 在一家餐厅工作,需处理 份待烹饪的订单。每份订单记录在一张纸条上,纸条按序钉在尖桩上。Bajtazar 只能从顶部取下纸条,依次完成订单。烹饪耗时,他希望尽快完成所有订单,且不必逐一处理。假设尖桩上剩余 份订单,他可选择以下操作:
- 取顶部一份订单,耗时 烹饪。
- 若 ,取顶部两份订单,耗时 烹饪。
- 若 ,取顶部 份订单,耗时 烹饪。
Bajtazar 的初始能量为 。第三种操作(取一半订单)极耗体力,降低 单位能量;第一种操作(单份订单)是他的专长,增加 单位能量。能量不得低于 。他不关心最终能量,只求最短时间内完成所有订单。
编写程序,通过与提供 Bajtazar 状态和厨房信息的库交互,找出最短的订单完成时间。本题需特别注意内存限制。
交互方式
程序需使用库,包含以下语句:
- C/C++:
#include "ckuclib.h" - Pascal:
uses pkuclib;
库提供以下函数:
返回整数 ,表示订单数量; 返回整数 ,表示 Bajtazar 初始能量。
// C/C++
int dajn();
int daje();
// Pascal
function dajn: LongInt;
function daje: LongInt;
- $\texttt{jeden}(k), \texttt{dwa}(k), \texttt{polowa}(k)$
返回当尖桩上有 份订单时,分别烹饪一份、两份或 份订单的耗时。若 , 和 无意义。耗时为 至 的整数。
// C/C++
int jeden(int k);
int dwa(int k);
int polowa(int k);
// Pascal
function jeden(k: LongInt): LongInt;
function dwa(k: LongInt): LongInt;
function polowa(k: LongInt): LongInt;
向库报告最短完成时间 ,调用后程序终止。
// C/C++
void odpowiedz(int wynik);
// Pascal
procedure odpowiedz(wynik: LongInt);
程序不得读取任何数据(标准输入或文件),不得写入文件或标准输出,可写入标准错误输出(stderr,但耗时)。可多次查询库。
示例评测程序
「文件」中提供了示例库,用于测试程序形式正确性。库从标准输入读取以下格式数据:
- 第一行:两个整数 ;
- 第二行: 个 内的整数,为 在 的值;
- 第三、四行: 和 的值(同格式, 值无意义)。
示例输入见文件 kuc0.in。调用 后,库输出答案至标准输出。
目录内还有示例程序 kuc.c, kuc.cpp, kuc.pas,使用库但不正确,仅在最后调用 ,其余用 。
编译命令:
- C:
gcc -O2 -static ckuclib.c kuc.c -lm -std=gnu99 - C++:
g++ -O2 -static ckuclib.c kuc.cpp -lm -std=c++11 - Pascal:
ppc386 -O2 -XS -Xt kuc.pas
程序与库文件需在同一目录。
样例
以下是程序示例运行过程:
| C/C++ | Pascal | 结果 |
|---|---|---|
n = dajn(); |
n := dajn; |
3 |
e = daje(); |
e := daje; |
1 |
p[3] = polowa(3); |
p[3] := polowa(3); |
1 |
p[2] = polowa(2); |
p[2] := polowa(2); |
4 |
j[2] = jeden(2); |
j[2] := jeden(2); |
2 |
j[1] = jeden(1); |
j[1] := jeden(1); |
5 |
d[2] = dwa(2); |
d[2] := dwa(2); |
6 |
odpowiedz(7); |
odpowiedz(7); |
- |
上述程序运行在形式上正确,但未必给出最优结果。从数据可知,操作 和 (耗时 )优于一次 和两次 (耗时 )。因 ,不宜在 时选 。但 限制了两次 。若不知 耗时,无法确认 后接 是否更优。
数据范围与提示
详细子任务附加限制及分值如下表所示。
| 子任务 | 附加限制 | 分值 |
|---|---|---|