1. 程式人生 > 其它 >Codeforces1617D1. Too Many Impostors (easy version)

Codeforces1617D1. Too Many Impostors (easy version)

傳送門

題目大意

互動題, \(n(6\leq n<10^4,n\)\(3\) 的倍數 \()\) 個人,其中有 \(k(\frac{n}{3}<k<\frac{2n}{3})\) 個壞人, \(n-k\) 個好人。每次可以詢問三個互不相同的人 \(a,b,c\) ,如果答案為 \(0\) ,說明他們三個中壞人多,答案為 \(1\) 則說明好人多,在 \(2n\) 次詢問內求出 \(k\)

思路

可以從 \(1,2,3\) 開始詢問,每次詢問 \(x,x+1,x+2\) ,如果前後兩次詢問不同,則說明兩次詢問重疊部分的兩個人 \(a,b\) 有一個是好人,一個是壞人,之後每次詢問 \(a,b,x\)

可以得出其他所有人的身份,最後再找兩個身份不同的人分別判斷 \(a,b\) 的身份即可,最多會詢問 \(2n\) 次。

程式碼

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
using PII = pair<int, int>;
using TP = tuple<int, int, int>;
#define all(x) x.begin(),x.end()
//#define int LL
//#define lc p*2
//#define rc p*2+1
//#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
//#pragma warning(disable : 4996)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const double eps = 1e-8;
const LL MOD = 1000000007;
const LL mod = 998244353;
const int maxn = 85;

int T, N;
vector<int>ans;

void solve()
{
	int a, b, c, d;
	int t, lst = -1;
	for (int i = 3; i <= N; i++)
	{
		cout << "? " << i - 2 << ' ' << i - 1 << ' ' << i << endl;
		cin >> t;
		if (lst != -1 && lst != t)
		{
			a = i - 2, b = i - 1;
			break;
		}
		lst = t;
	}
	for (int i = 1; i <= N; i++)
	{
		if (i == a || i == b)
			continue;
		cout << "? " << a << ' ' << b << ' ' << i << endl;
		cin >> t;
		if (!t)
			ans.push_back(i), c = i;
		else
			d = i;
	}
	cout << "? " << c << ' ' << d << ' ' << a << endl;
	cin >> t;
	if (!t)
		ans.push_back(a);
	cout << "? " << c << ' ' << d << ' ' << b << endl;
	cin >> t;
	if (!t)
		ans.push_back(b);
	cout << "! " << ans.size() << ' ';
	for (auto& c : ans)
		cout << c << ' ';
	cout << endl;
}

int main()
{
	IOS;
	cin >> T;
	while (T--)
	{
		ans.clear();
		cin >> N;
		solve();
	}

	return 0;
}