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
",f[maxx]);
    return 0;
}
原文地址:https://www.cnblogs.com/jasony/p/13777968.html