1. 握手问题

87 阅读2分钟

问题描述

小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手 (但这 7 人与除这 7 人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手?

思路讲解1

暴力枚举法,定义i从1到50依次循环,相当于50个人

再定义j从i+1到50依次循环,相当于两两握手

规定最后七个人没有彼此握手,所以要去除掉

  1. 外层循环:
  • int i = 1:初始化变量 i 从1开始
  • i <= 50:循环条件,当 i 小于等于50时继续循环
  • i++:每次循环后 i 加1
  1. 内层循环:
  • int j = i+1:初始化变量 j 从 i+1 开始
  • j <= 50:循环条件,当 j 小于等于50时继续循环
  • j++:每次循环后 j 加1

这种循环结构的特点是:

  • 它会产生所有 i < j 的组合
  • 不会产生重复的组合(比如不会同时出现 (1,2) 和 (2,1))
  • 也不会产生相同的数字组合(比如不会出现 (1,1))

代码讲解1

#include <bits/stdc++.h>

using namespace std;

int main(){
  int cnt = 0;
  for(int i = 1;i <= 50; i++){
    for(int j = i+1;j <= 50; j++){
        if(!(i>=1 && i<=7 && j>=2 && j<=7)){
          cnt++;
        }
    }
  }
  cout << cnt;
  return 0;
}

思路讲解2

数学法,因为每个人与自己以外的人要握手,第一个人就要与49个人握手。第二个人就要与48个人握手,以此类推,倒数第二个人只需要和一个人握手,最后一个人就不需要握手了

49+48+...+1=(1+49)*49/2

但是有7个人,彼此没有握手

6+5+4+3+2+1 =(1+6)*6/2

两者相减就是答案

代码讲解2

#include <bits/stdc++.h>

using namespace std;

int main(){
  int a = (1+49)*49/2;
  int b = (1+6)*6/2;
  cout << a - b;
  return 0;
}