#P15669. [Bulgarian2024训练营]Prison监狱

[Bulgarian2024训练营]Prison监狱

题目描述

Prasi 把 500 名信息学选手关进了监狱。为了释放他们,选手们必须合作解决一个问题。

Prasi 有两个数组,长度分别为 AABB。保证:

AB,1A,BN.A\ne B, \qquad 1\le A,B\le N.

两张纸条上分别写有 AABB 的值,并标明对应数组名。选手们的目标是判断哪个数组更短。

在开始前,所有选手可以约定一个共同策略。之后,Prasi 会遮住他们的眼睛,并按未知顺序让他们依次进入房间。

房间里有一块黑板、一支粉笔、一块板擦、两张写有数组长度的纸条,以及 Prasi。黑板上始终写着一个 00MM 之间的整数,初始为 00。当前进入房间的选手可以:

  1. 看到黑板上的数字;
  2. 选择查看两张纸条之一,即查看 AABB 的值;
  3. 查看后,他可以:
    • 宣布哪个数组更短;或
    • 擦掉黑板上的数字,写上一个新的 00MM 之间的整数。

不能作弊,也不能使用随机策略。你需要设计一个确定性策略,使得在不超过 500 名选手依次进入房间的情况下,一定能判断 AABB 哪个更小,并且希望 MM 尽可能小。

实现方式

本题为函数式提交题,需要实现:

std::vector<std::vector<int>> devise_strategy(int N);

该函数只会被调用一次,参数 NN 是数组长度的上界。函数应返回一个二维数组 ss,大小为 (M+1)×(N+1)(M+1)\times (N+1)

对于状态 ii,即黑板上写着数字 ii

  • s[i][0]s[i][0] 表示当前选手要查看哪张纸条:
    • s[i][0]=0s[i][0]=0:查看 AA
    • s[i][0]=1s[i][0]=1:查看 BB
  • 若查看到的值为 jj,其中 j>0j>0,则 s[i][j]s[i][j] 表示接下来的动作:
    • s[i][j]=1s[i][j]=-1:宣布 A<BA<B
    • s[i][j]=2s[i][j]=-2:宣布 B<AB<A
    • 0s[i][j]M0\le s[i][j]\le M:在黑板上写下新数字 s[i][j]s[i][j],交给下一名选手继续。

数据范围

  • 2N50002\le N\le 5000
  • 策略最多使用 500 次进入房间的机会。

子任务与评分

子任务 分值 限制
1 5 N500, M500N\le 500,\ M\le 500
2 N500, M70N\le 500,\ M\le 70
3 90 N500, M60N\le 500,\ M\le 60,按最大使用状态数 MmaxM_{max} 部分评分

第三个子任务的部分分规则:

  • 40Mmax6040\le M_{max}\le 60:20 分;
  • 26Mmax3926\le M_{max}\le 3925+1.5(40Mmax)25+1.5(40-M_{max}) 分;
  • Mmax=25M_{max}=25:50 分;
  • Mmax=24M_{max}=24:55 分;
  • Mmax=23M_{max}=23:62 分;
  • Mmax=22M_{max}=22:70 分;
  • Mmax=21M_{max}=21:80 分;
  • Mmax20M_{max}\le 20:90 分。

本地测试说明

原题提供 Lgrader.cpp 用于本地测试。其输入格式为:

  • 第一行:NN
  • 接下来若干行:A,BA,B
  • 最后一行:-1

本地 grader 会输出你的策略是否能通过对应测试。

示例交互

N=2N=2 时,可以返回:

{{0, -1, -2}}

这表示:黑板数字始终为 00,当前选手查看 AA。若 A=1A=1,则一定有 B=2B=2,宣布 A<BA<B;若 A=2A=2,则一定有 B=1B=1,宣布 B<AB<A

@下发文件