#HK5102. 「POI2009 R2」建筑师 Architect

「POI2009 R2」建筑师 Architect

题目描述

题目译自 XVI OI Olimpiada Informatyczna – II etap Architekci

国王 Bajtazar 计划兴建一座新宫殿,宣布举办建筑设计大赛,征集最佳方案。为激励建筑师加紧工作,他规定将按提交顺序评审设计。

这项任务声名显赫,吸引了全球建筑师向王室办公厅提交方案。提案数量庞大,Bajtazar 无暇逐一审阅,遂委托大法官初步筛选,遵循以下规则:

  • 大法官需挑选 kk 个方案,立即淘汰其余——Bajtazar 知晓自己最多只能审阅 kk 个方案。
  • 方案须按提交顺序呈交,Bajtazar 将依此顺序评审,符合其承诺。
  • 在满足上述条件的所有 kk 个方案序列中,大法官需选出最佳序列,定义如下:

序列 (p1,p2,,pk)(p_1, p_2, \ldots, p_k) 优于 (r1,r2,,rk)(r_1, r_2, \ldots, r_k),若存在 l1l \geq 1,使得前 l1l-1 个方案两序列等同(即 pi=rip_i = r_i,对 i<li < l),但第 ll 个方案 pl>rlp_l > r_l

方案源源不断提交,截止日期未定。大法官不愿临近截止才选方案,又恐出错惹国王震怒,遂向你求助。

编写程序,完成以下任务:

  • 通过提供的库读取 kk 和表示方案质量的序列。
  • 确定符合规则的最佳 kk 个方案序列。
  • 通过库返回所选方案的质量。

交互方式

使用库需在程序中引入:

  • C/C++:#include "carclib.h"
  • Pascal:uses parclib;
  • Java:无需额外操作,但运行时需确保编译好的库 jarclib.class 与程序在同一目录。

库提供以下三个函数:

  • inicjuj:返回整数 kk (1k1000000)(1 \leq k \leq 1000000),表示结果序列应包含的方案数。需在程序开始时调用一次。
    • C/C++:int inicjuj();
    • Pascal:function inicjuj(): longint;
    • Java:public static int inicjuj();jarclib 类静态方法)
  • wczytaj:第 ii 次调用返回整数 pip_i (1pi1000000000)(1 \leq p_i \leq 1000000000),表示第 ii 个方案的质量(越大越好),或 00,表示无更多方案。方案总数未知,但保证至少 kk 个,最多 1500000015000000 个。需反复调用直至返回 00,不可多调用。
    • C/C++:int wczytaj();
    • Pascal:function wczytaj(): longint;
    • Java:public static int wczytaj();jarclib 类静态方法)
  • wypisz:用于提交大法官选出的方案质量,需调用 kk 次,第 ii 次提交第 ii 个方案的质量。第 kk 次调用后程序终止。
    • C/C++:void wypisz(int jakoscProjektu);
    • Pascal:procedure wypisz(jakoscProjektu: longint);
    • Java:public static void wypisz(int jakoscProjektu);jarclib 类静态方法)

程序不得打开文件或使用标准输入输出。编译命令:

  • C:gcc -O2 -static carclib.c arc.c -lm
  • C++:g++ -O2 -static carclib.c arc.cpp -lm
  • Java:javac arc.java,需确保 jarclib.class 在同一目录。
  • Pascal:ppc386 -O2 -XS -Xt arc.pas,需确保 parclib 在同一目录。

示例库和参考代码位于 「文件」中。示例库从标准输入读取测试场景,格式如下:

  • 第一行:正整数 kk
  • 后续行:每行一个正整数 pip_i,表示第 ii 个方案质量。
  • 最后一行:00,表示方案结束。

示例库将程序提交的 kk 个方案质量输出到标准输出,每行一个。

样例

C/C++ Pascal Java 返回值及说明
k = inicjuj(); k := inicjuj(); k = jarclib.inicjuj(); k=3k=3,确定输出序列长度。
开始读取方案质量。
wczytaj(); wczytaj(); jarclib.wczytaj(); 1212
wczytaj(); wczytaj(); jarclib.wczytaj(); 55
wczytaj(); wczytaj(); jarclib.wczytaj(); 88
wczytaj(); wczytaj(); jarclib.wczytaj(); 33
wczytaj(); wczytaj(); jarclib.wczytaj(); 1515
wczytaj(); wczytaj(); jarclib.wczytaj(); 88
wczytaj(); wczytaj(); jarclib.wczytaj(); 00,方案读取结束。
输出结果序列:
wypisz(12); wypisz(12);` jarclib.wypisz(12); 1212
wypisz(15); wypisz(15); jarclib.wypisz(15); 1515
wypisz(8); wypisz(8); jarclib.wypisz(8); 88

数据范围与提示

详细子任务附加限制及分值如下表所示。

子任务 附加限制 分值
11 k10k \leq 10 1515
22 k1000k \leq 1000 2525
33 pi1000p_i \leq 1000 2020
44 无附加限制 4040