题型:组合题
精明与糊涂
有N个人,分为两类:①精明人:永远能正确判断其他人是精明还是糊涂;②糊涂人:判断不可靠,会给出随机的判断。已知精明人严格占据多数,即如果精明人有k个,则满足k>N/2
你只能通过函数query(;j)让第i个人判断第j个人:返回true表示判断结果为“精明人”;返回false表示判断结果为“糊涂人”。目标是通过互相判断,找出至少一个百分之百能确定的精明人(无需关心query(i,j)的内部实现)。
以下程序利用“精明人占多数”的优势,通过“消除”过程让人们互相判断并抵消.经过若干轮抵消后,最终留下的候选者必然属于多数派,即精明人。
例如,假设有三个人0、1、2。如果0说1是糊涂人,而1也说0是糊涂人,则O和1至少有一个是糊涂人。程序将同时淘汰0和1。由千三人里至少有两个精明人,我们确定2是精明人。试补全程序。
#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;
} (1).①处应填()
| A. 0 |
B. 1 |
| C. N |
D. -1 |
⑥处应填()
| A. N-1 |
B. count |
| C. candidate |
D. 0 |
②处应填()
| A. count<0 |
B. count==1 |
| C. count==0 |
D. query(candidate,i)==false |
④处应填()
| A. count-- |
B. break |
| C. count++ |
D. candidate=i |
③处应填()
| A. query(candidate,i)==false |
B. query(i,candidate)==true |
| C. query(candidate,i)==false &&query(i,candidate)==false |
D. query(candidate,i)==falsell query(i,candidate)==false |
更新时间:2025-10-15 18:08:10
|
【知识点】
CCF非专业级别软件能力认证CSP-J/入门级
抱歉! 您未登录, 不能查看答案和解析点击登录











