目录
一、题目
1、题目描述
2、输入/交互
2.1输入
2.2交互
3、原题链接
二、解题报告
1、思路分析
我们只考虑前k+1个数字的长度为k的子序列,显然有k + 1种情况,即枚举去掉哪个数字
那么当去掉的数字是第1~m小的数字,我们查询结果会是第m + 1小的数
当去掉的数字是第m + 1~k + 1小的数字,我们查询结果会是第m小的数字
可以得出:
长度为k + 1的数组的k + 1个子序列的查询结果只有两种可能
第m 小和第m + 1小
第m + 1小的数字出现m次,即去掉的数字为第1~m小时的情况
那么我们只要对k + 1次查询的返回结果计数,最大数字的出现频次就是m
---
思考:为什么取前k + 1而不是前k?
为了保证当m = k时,第m + 1小存在
而且k < n,k + 1 <= n,保证了查询的合法性
2、复杂度
时间复杂度: O(k^2)空间复杂度:O(k)
3、代码详解
import sys
from collections import Counter
# sys.stdin = open('in.txt', 'r')
n, k = map(int, input().split())
st = Counter()
for i in range(1, k + 2):
print('?', *(j for j in range(1, k + 2) if j != i), flush=True)
idx, val = map(int, input().split())
st[val] += 1
print('!', st[max(st)])