Codeforces1617D1. Too Many Impostors (easy version)
阿新 • • 發佈:2022-04-12
題目大意
互動題, \(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\)
程式碼
#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; }