#P15565. [Nsi2025十年级]Survey相互责任

[Nsi2025十年级]Survey相互责任

题目描述

Hristo 所在公司的所有员工分为诚实员工和腐败员工,并且每名员工都知道谁属于哪一类。

一天,公司迎来了检查委员会。所有员工围坐在一张圆桌旁,每个人都收到了同一个问题:

“在你右侧接下来的 kk 名员工中,有多少名腐败员工?”

所有诚实员工都会给出正确答案。腐败员工则试图误导检查人员,并且总是给出一个与真实答案恰好相差 11 的回答。也就是说,如果右侧接下来的 kk 名员工中有 xx 名腐败员工,那么腐败员工会回答 x+1x+1x1x-1。但回答不能小于 00:如果右侧全是诚实员工,那么唯一可能的错误答案是 11

请编写程序 survey,根据问卷结果,求出公司中腐败员工数量的最小可能值和最大可能值。

实现细节

你需要在程序中实现如下函数:

pair<int, int> corrupt(int n, int k, const std::vector<int>& answers)
  • 该函数会被评测程序调用恰好一次;
  • nn 表示围坐在圆桌旁的人数;
  • kk 表示每个人回答时考虑其右侧接下来的多少个人;
  • answers 按圆桌座位顺序给出所有员工的回答;
  • 函数应返回一个二元组:
    • 第一个元素为腐败员工数量的最小可能值;
    • 第二个元素为腐败员工数量的最大可能值。

实现该函数的程序中可以包含其他必要的代码和辅助函数,但不应包含 main 函数,也不应从标准输入读取或向标准输出写入

数据范围

  • 2n10002 \le n \le 1000
  • 1kmin(n1,10)1 \le k \le \min(n-1,10)
  • 0aik+10 \le a_i \le k+1

其中 aia_i 表示第 ii 名员工的回答。

子任务

子任务 分值 依赖子任务 nn kk
1 20 - 1000\le 1000 =1=1
2 30 10\le 10 min(n1,10)\le \min(n-1,10)
3 50 1, 2 1000\le 1000

只有通过某个子任务的所有测试点,才能获得该子任务分数。

样例

评测程序调用 返回值
corrupt(4, 1, {0, 0, 0, 0}) {0, 4}
corrupt(5, 1, {1, 1, 1, 1, 0}) {2, 3}

本地测试

题目提供了 grader.cpp,你可以将其与你的程序一起编译进行本地测试。

运行时,程序将从标准输入读取:

  • 第一行:nnkk
  • 第二行:answers[i],其中 i=0,1,,n1i=0,1,\ldots,n-1

程序会在标准输出的一行中输出两个整数:最小可能腐败人数和最大可能腐败人数,按此顺序输出。