CF1270D Strange Device
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\n",f[maxx]);
return 0;
}