Problem C: 游戏热度排行榜

Memory Limit:128 MB Time Limit:1.000 S
Judge Style:Text Compare Creator:
Submit:23 Solved:17

Description

游乐场的节奏游戏角越来越热闹。系统会记录每位玩家一局比赛中每一秒的连击加分。主管想把每位玩家“连续 K 秒得分总和最高”的一段剪成高光回放,并生成游乐场的"游戏热度排行榜"。

给定 N 位玩家、每局 M 秒的得分矩阵 a,a[i][j] 表示依序编号为 i 的玩家第 j 秒的连击加分。

对每位玩家考虑所有长度为 K的连续区间( 共M-K+1个起点:b=1...M-K+1 ),区间和 S[i] = a[i] + a[i][b+1] + ... +a[i][b+K-1] 。记:

  • H(i) = 最大的区间和; 若多个区间同时取得最大值,规定选起点编号最小的那个,其起点记为P(i);
  • 排行榜: H(i) 较大的玩家排在前面; H(i) 相同时,编号较小的排在前面。

Input

输入第一行三个整数 N M K。接下来 N 行,每行 M 个整数,第 i 行第 j 个数表示 a[i][j]。

Output

输出按排行榜顺序输出 N 行,每行三个整数:编号, H(i) ,P(i)。

Sample Input Copy

3 6 3
5 1 4 2 6 3
9 9 0 0 0 9
4 4 4 4 4 4
​

Sample Output Copy

2 18 1
1 12 3
3 12 1

样例解释:
玩家 1 的 "连续K=3" 的 4 个窗口和依次为 10、7、12、11,最大值 12 在起点 3;玩家 2 的最大值 18 在起点 1;玩家 3 每个窗口和都是 12,按“起点最小”的规定取起点 1。榜单中玩家 1 与玩家 3 的 H 相同,按编号玩家 1 排在前面。

HINT

1 ≤ N ≤ 100,1 ≤ K ≤ M ≤ 2000,0 ≤ a[i][j] ≤ 100。

AI 辅助编程建议:

①确认需求。 让 AI 用自己的话复述四个细节:一局共有 M−K+1 个窗口(不是 M 个);起点编号从 1 开始;“和相同取最小起点”是玩家内部挑高光的规定;“H 相同比编号”是榜单排名的规定。两条“相同”规则作用对象不同,不能混为一谈。

②生成程序。 指定考试要求的语言,请 AI 说明窗口和怎么维护(逐窗累加、前缀和还是滑动窗口),并估算 N=100、M=2000、K=1000 时的运算量,判断是否会超时。若 AI 写出对每个窗口重新求和的双重循环,请追问能否优化成一次扫描。

③审查逻辑。 重点检查:滑动更新时是否“减去左端、加上右端”,方向有没有写反;起点编号是否跟着窗口一起移动;更新最大值是否用“严格大于”——写成 ≥ 会把起点改成较大的;K=M 时全局只有一个窗口,循环边界是否仍正确。

④补充测试。 除题面样例外,还应检查:K=M(唯一窗口);K=1(高光即单秒最大值,并列时要取最小起点);全 0 数据(H=0、起点 1);M=K=1 的最小规模;N=100、M=2000 的最大规模。

⑤迭代修正。 如果实际输出与预期不一致,把输入、预期输出和实际输出一并提供给 AI,并主动说明怀疑方向(例如“起点是不是取大了”);修改后重新运行全部测试,不能只跑刚才失败的那一条。