每日c/c++题 备战蓝桥杯(握手问题)

试题 A: 握手问题 题解

题目描述

小蓝组织了一场算法交流会议,共有50人参加。按照惯例,每个人都要与除自己外的其他所有人握手一次。但有7个人彼此之间没有握手(这7人与其他43人正常握手)。求实际发生的握手总次数。

解题思路

常规握手问题模型

对于 n人 参与的会议,握手总次数可以用组合数公式计算:
C ( n , 2 ) = n ( n − 1 ) 2 C(n,2) = \frac{n(n-1)}{2} C(n,2)=2n(n1)
因为每两人之间仅握手一次,共有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1) 种组合。

本题特殊情况

存在 7人 彼此之间不握手,这意味着我们需要从总握手次数中扣除这7人之间的理论握手次数。即:

  1. 计算50人全握手的总次数
    C ( 50 , 2 ) = 50 × 49 2 = 1225 C(50,2) = \frac{50 \times 49}{2} = 1225 C(50,2)=250×49=1225

  2. 计算7人之间的理论握手次数
    C ( 7 , 2 ) = 7 × 6 2 = 21 C(7,2) = \frac{7 \times 6}{2} = 21 C(7,2)=27×6=21

  3. 实际握手次数
    实际握手次数等于总次数扣除未发生的7人握手次数:
    1225 − 21 = 1204 1225 - 21 = 1204 122521=1204

关键点分析

  • 组合数应用:本题核心在于正确应用组合数公式建立数学模型。
  • 特殊条件处理:正确处理7人组内部握手缺失的情况,避免重复计算或漏算。
  • 数值计算:注意大数运算时的准确性,避免计算错误。

代码验证(C++)

#include 

int main() {
    // 计算50人的总握手次数
    int total = 50 * 49 / 2;
    // 计算7人未发生的握手次数
    int exclude = 7 * 6 / 2;
    // 输出实际握手次数
    std::cout << total - exclude << std::endl;
    return 0;
}

你可能感兴趣的:(c语言,c++,蓝桥杯)