思路:

对数组的前k + 1个元素询问k + 1次,结果会出现两个数字,分别是第m大的数和第m + 1大的数。并且,第m + 1大的数将出现m次,第m大的数将出现k + 1 - m次。因此,统计较大的那个数出现的次数即是答案。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n, k;
 6     cin >> n >> k;
 7     set<int> st;
 8     for (int i = 1; i <= k + 1; i++) st.insert(i);
 9     int x, p;
10     map<int, int> mp;
11     for (int i = 1; i <= k + 1; i++)
12     {
13         if (i > 1) st.insert(i - 1);
14         st.erase(i);
15         cout << "? ";
16         for (auto it: st) cout << it << " ";
17         cout << endl;
18         cout.flush();
19         cin >> x >> p;
20         mp[p]++;
21     }
22     cout << "! " << mp.rbegin()->second << endl;
23     return 0;
24 }
12-14 16:56
查看更多