一、題目
【問題描述】
? 小藍組織了一場算法交流會議,總共有 50 人參加了本次會議。在會議上,大家進行了握手交流。按照慣例他們每個人都要與除自己以外的其他所有人進行一次握手(且僅有一次)。但有 7 個人,這 7 人彼此之間沒有進行握手(但這 7 人與除這 7 人以外的所有人進行了握手)。請問這些人之間一共進行了多少次握手?
注意 A 和 B 握手的同時也意味著 B 和 A 握手了,所以算作是一次握手。? ? ? ????????
二、思路
方法一:
????????對于這種題,我一般是來找規律,我們從最簡單的開始,有2個人的話,我們需要握手1次,3個人我們需要握手3次,四個人需要握手6次,5個人需要握手10次,6個人需要15次
人數 | 握手次數 |
2 | 1 |
3 | 3=2+1 |
4 | 6=3+2+1 |
5 | 10=4+3+2+1 |
6 | 15=5+4+3+2+1 |
????????我們不難找到一些規律,握手次數是? 人數-1 開始向下逐個相加到1,3個人就是3-1向下開始相加(2+1)
? ? ? ? 但是題中說7個人是不相互握手的,我們假設3個人不握手,看上面的表,3個人將不握手3次(2+1),7個人將不握手6+5+4+3+2+1=21次
? ? ? ? 50個人握手49+48+47+...+2+1=1225次
? ? ? ? 又7個人不握手,1225-7=1204次
方法二:(代碼)
三、代碼
#include<iostream>
using namespace std;
int main(){
// 總握手次數計算:如果沒有任何限制,50人兩兩握手的次數為組合數C(50, 2)。
//排除7人之間的握手次數:這7人之間沒有握手,因此需要從總次數中減去C(7, 2)。int total = 50;int subtract = 7;int total_hands = total * (total - 1)/2;int subtract_hands = subtract * (subtract - 1)/2;cout<< total_hands-subtract_hands << endl;return 0;
}
四、反思
組合
-
每次握手是?無序的(A 和 B 握手與 B 和 A 握手是同一件事)。
-
組合數?C(n,2)?正是用來計算?無序且不重復的兩兩配對?的數量,
排列數 A(n, m) 與組合數 C(n, m) 的求法_排列組合-CSDN博客