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;
}
posted @ 2020-10-07 16:55  jasony_sam  阅读(101)  评论(0编辑  收藏  举报