五、阅读程序-2

精明与糊涂
有N个人,分为两类:
● i) 精明人:永远能正确判断其他人是精明还是糊涂;
● ii) 糊涂人:判断不可靠,会给出随机的判断。
已知精明人严格占据多数,即如果精明人有k个,则满足k>\(\frac{N}{2}\) 。
你只能通过函数query(i,j) 让第 i 个人判断第 j 个人:返回true表示判断结果为“精明人”;返回false表示判断结果为“糊涂人”。你的目标是通过互相判断,找出至少一个百分之百能确定的精明人。同时,你无需关心 query(i,j)的内部实现。
以下程序利用“精明人占多数”的优势,通过“消除”过程让人们互相判断并进行抵消,经过若干轮抵消后,最终留下的候选者必然属于多数派,即精明人。
例如,假设有三个人 0、1、2。如果0说1是糊涂人,而1也说0是糊涂人,则0和1至少有一个是糊涂人。程序将同时淘汰0和1。由于三人里至少有两个精明人,我们确定2是精明人。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <vector>
using namespace std;

int N;
bool query(int i, int j);

int main() {
	cin >> N;

	int candidate = 0;
	int count = ①;

	for (int i = 1; i < N; ++i) {
		if (②) {
			candidate = i;
			count = 1;
		} else {
			if (③) {
				④;
			} else {
				count++;
			}
		}
	}
	
	cout << << endl;
	return 0;
}