D. Strange Device:巧妙的交互題

題目鏈接

題目大意:有一個長度爲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]);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章