題目鏈接
題目大意:有一個長度爲n的隱藏數組a,其中元素兩兩不同。你有一臺機器可以最多詢問n次,每次可以向這個機器輸入k個數,這些數是下標(範圍1到n)。而機器會返回這些數中第m大的數的值,以及他的下標。已知k,求m。
題解:其實解法在樣例就有體現(後悔當時沒有研究樣例)。我們只需對前k+1個數查詢k+1次,這樣只會得到兩個元素的值,一個是第m大的數,一個是第m+1大的數。第m大的數會出現(k + 1 - m)次, 第m + 1大的數會出現 m 次。所以我們只需要統計較大值出現的次數就是答案m了。
那爲什麼第m大的數會出現(k + 1 - m)次, 第m + 1大的數會出現 m 次?
答:當我們對前k+1個數詢問k+1次時,實際上就是依次從k+1個數中去掉一個數進行查詢。如果去掉的是前1 ~ m中的某一個數,那詢問所得到的值則只會是第m + 1大的數。剩下的去掉m+1 ~ k + 1中的數,詢問所得到的值必將會是第m大的數。
#include<bits/stdc++.h>
using namespace std;
map<int, int>mp;
int main()
{
int n, k, mx = 0;
cin>>n>>k;
for(int j = 1; j <= k + 1; ++j){
printf("?");
for(int i = 1; i <= k + 1; ++i){
if(i != j) printf(" %d", i);
}
printf("\n");
fflush(stdout);
int p, x;
scanf("%d%d", &p, &x);
mp[x]++;
mx = max(mx, x);
}
printf("! %d\n", mp[mx]);
}