问题描述
小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手 (但这 7 人与除这 7 人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手?
思路讲解1
暴力枚举法,定义i从1到50依次循环,相当于50个人
再定义j从i+1到50依次循环,相当于两两握手
规定最后七个人没有彼此握手,所以要去除掉
- 外层循环:
- int i = 1:初始化变量 i 从1开始
- i <= 50:循环条件,当 i 小于等于50时继续循环
- i++:每次循环后 i 加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;
}