1. 握手问题(结果填空)
【问题描述】
小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手(但这 7 人与除这 7人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手?
注意 A 和 B 握手的同时也意味着 B 和 A 握手了,所以算作是一次握手。
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分_____.
【解析】
此题为一道比较简单的基础题,若不考虑后面七人,则此题变为50人间相互握手,很容易想到高中的排列组合,也就是50*49/ 2;及在50人里面选两人握手,因为相同两人互相握手算一次,所以需消序,如果加上限制条件,那就意味着可以想象成43人间相互握手,然后七人与43人间握手,
根据上述思路我们可以直接翻译题目写出简单的代码。
【答案描述】
#include<stdio.h>
int main()
{
int ans;//ans 为握手的数
ans = 0;
for (int i = 1; i <= 43; i++)//此处为43人互相握手
{
for (int j = 1; j <= 43; j++)
{
if (i != j)//自己不能和自己握手
{
ans++;
}
}
}
ans = ans / 2;//互相握手算一次,除2;
for (int i = 1; i <= 7; i++)
{
for (int j = 1; j <= 43; j++)
{
ans++;
}
}//根据循环第二次只用特殊七人与43人握手无需消序;
printf("%d", ans);
}
计算出答案1204.
但需要注意的是第一次是43人间相互握手,需要消序,而第二个循环只是7人分别与另外43人握手,故没有“礼尚往来”,因此无需消序
【改进】
从高中的数学角度,我们对于第一题已经有了一个较好的理解,再此基础上,我们进一步用计算机的思维分析,50人中七人特殊,我们将50人排成一个序列,将7人放在最前列(或者最后列均可)
作为握手循环需遍历两次,即第一次遍历握手的人(i),第二次遍历被握手的人(j),则在i和j均小于7的时候,他们是不握手的,除此之外,当i=j时(人不会与自己握手),握手次数也不会增加,
则当出现上述情况时我们跳出此次循环进入下一次循环
因此在一个循环中我们可以将上述思路整合成以下代码
#include<stdio.h>
int main()
{
int ans;
ans = 0;
for (int i = 1; i <= 50; i++)
{
for (int j = 1; j <= 50; j++)
{
if (i == j || (i <= 7 && j <= 7))
{
continue;
}
else {
ans++;
}
}
}
ans = ans / 2;
printf("%d", ans);
}
以上就是2024蓝桥杯的A题,后续题目思路关注动态,up会在两周内赶完的,还有A组!
新人求关注!!!