Solution
我们可以对前 (k+1) 个元素询问 (k+1) 次,因为题目中明确说明 (k<n) ,所以是不会超的。
这样做的正确性:每次会少一个数,当你少的是第 (m) 个数之前的数或 (m) 时,返回的会是第 (m+1) 大的数,当你少的是 (m) 之后的数时,返回的是第 (m) 大的数。
第 (m+1) 大的数会出现 (m) 次,第 (m) 大的数会出现 (k+1-m) 次,所以统计较大数出现次数即可。
#include<bits/stdc++.h>
using namespace std;
map<int,int> f;
int main(){
ios::sync_with_stdio(false);
int n,k;
cin>>n>>k;
int maxx=0;
for(int i=1;i<=k+1;i++){
putchar('?');
for(int j=1;j<=k+1;j++){
if(i==j) continue;
printf(" %d",j);
}
puts("");
fflush(stdout);
int x,y;
cin>>x>>y;
f[y]++;
maxx=max(maxx,y);
}
printf("! %d
",f[maxx]);
return 0;
}