思路:
对数组的前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 }