编程任务|随机摆放的刀叉开始认识数学思维

news2024/11/18 17:26:09

任务源自旧版的Brilliant数学讨论问题。2019-09-02我曾经发布过,可惜已经下线,幸活大喵做足备份。

该问题看似是概率问题,实则不然。

官方给出的解法透露出一个非常重要的数学思维方法:

数学语言 —— 为何以及如何构造一个函数 f(n);

运用恰当构造的函数为逻辑推理的起点;

Python随机模块模拟验证之;

先从关键词开始——常用英文短语:

consecutive:连续 如1,2,3,4

in the line-up:排成一列

“There's a randomly ordered line of 15 forks and 15 spoons on the counter. Chef Nidhi only needs 5 forks and 5 spoons.Can she always pick up exactly what she needs by selecting 10 consecutive utensils starting from somewhere in the line-up?

alt

图片

15把叉子和15把勺子随机摆放的,图为示例

题目考察数学思维:

丁丁猫一家的厨房有30付餐具,包含15个叉子和15把刀。丁大喵说了,叉子和勺子的摆放要方便拿取,家里5个人吃饭,桌子上需要摆放5付刀叉,取餐具的时候,很方便地找出5把叉子和5把刀。

一家之主的丁老喵让孩子们想想,该怎么摆放?

丁小喵抢先发话:“每次刷碗后,叉子和勺子要分开摆放”

“不需要” 丁大喵说:"不必这么麻烦,经常有不自觉的取走不按规则放回去,

“ 无论刀叉怎样摆放顺序,都可以找到10个连续摆放的餐具,恰好满足有5个叉子和5个勺子!”

哦?真的可以做到吗?

丁大喵说的是真的吗?

任务场景之二

学校举办新学期的运动会,首先班级推荐10个旗手,要有5男生和5个女生组成方阵,走在班级队伍的最前面,要求10人的身高要尽量接近。

班里共有30人其中15个男生和15个女生。老师先按身高排出30人有高到低排出顺序。请问应该如何选出 5 对男女生推荐为旗手方阵的人选。

——似乎和刀叉的摆放有异曲同工之妙!

逻辑推理的思路梳理:

将30个餐具分成 20个连续的组。最左边开始选10个,即1到10为第1组,2-11为第2组,... 第20-30为第20组 —— 分组是整个思路的关键!!

设一个函数f(n)返回一组器具中叉的数量—— 数学语言描述

该函数显然是连续的,满足:

(1)因为两个连续组的叉的数目之间的差不能大于1。

考虑30把厨具里必然有15把叉子,那么下面必然成立

f(1)+f(10)+f(20) = 15

再看 f(1),f(10),f(20) 3个组中有没有等于5的,如果有,就是我们要找的那一组。如果没有,这三个函数的返回值必然要满足:

(2)至少一个必须大于5,其中一个小于5。

然后,如上所述函数返回值必然满足(1),(2),那么存在某个f(n),n不在1,10,20之间,但f(n)必然是小于5和大于5之间某个数,连续变化的数列中:

譬如3,4,5,6,7之间,可见,由于满足下面两个条件,必然存在某个n,f(n)的返回值恰好为5!

(1)两个连续组的叉的数目之间的差不能大于1

(2)至少一个必须大于5,其中一个小于5

丁小喵说:

“总觉的不踏实,能不能验证下呢?

怎么验证呢

... ...

丁大喵提醒小喵,你这学期学python了

试试python可以啊?!

alt

编程时刻开始 ...

叉子表达为1,勺子表达为0

随机生成一个只有0,1的数列

... ...

import random
from collections import Counter
while True:
    group = [random.randint(0, 1) for i in range(30)]   
    #叉子为1,勺子为0,随机数量生成数组group
    num_fork = str(group).count("1")
    num_spoon = str(group).count("0")
    if num_fork == 15 and num_spoon ==15:
        print(group)
        print(Counter(group))
        break
j = 0
while True:
    #print('随机顺序摆放的叉子和勺子:',group[j:j+10])
    fork = str((group[j:j+10])).count("1")
    spoon = str(group[j:j+10]).count("0")
    if fork == 5 and spoon == 5:
        print ('j =',j)
        print (group[j:j+10])
        break
    j += 1

生成刀叉的随机摆放顺序:

[1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 
1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 
0, 1, 1, 1, 1, 0, 0, 1, 0, 0]

保证刀叉各有15把:

Counter({1: 15, 0: 15})

j = 4

[0, 0, 1, 0, 0, 1, 1, 1, 0, 1]

解读:j =4 就是数列第5个数开始算起,10个连续厨具恰好满足5个叉子和5个勺子

时至今日,再看该任务依然启发力道十足!看能否再做些改进,也只能在随机生成函数的代码做些精简而已。

如何精简?

  1. 构造一个随机数列包含15个 1(folk)和 15个 0 (spoon)
  2. 长度为 30 的数组,包含30个 0
  3. 随机生成 15个数为0-29之间的地址脚标
random_index = [random.randint(0,29) for _ in range(30)]

print('random_index =',len(random_index),random_index)

random_index = 30 [13, 22, 4, 21, 7, 27, 2, 1, 27, 6, 
15, 20, 26, 22, 24, 29, 22, 29, 2, 4, 11, 2, 13, 27, 
2, 25, 28, 10, 23, 0]

显然有重复的值,不可取。不过可以去重操作完善之。 数组求和结果为15则验证随机数组符合要求。

def randomIndex(n):
    cunt,inbox = 0,[]
    init = [0] * n
    while sum(init) < n//2:
        #循环终止条件是恰好一半的元素值为 1
        idx = random.randint(0,29)
        if idx not in inbox: #地址去重
            inbox.append(idx)
            init[idx] = 1
        else:pass
        cunt += 1
    return init,sum(init)
    
n = 30
print(randomIndex(n))

([0, 1, 0, 1, 0, 0, 0, 0, 0,
1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 
0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1], 15)

以上输出的随机数组满足要求!

def check(s,l):
    for i in range(len(s)-l):        
        if s[i:i+l].count(0) == s[i:i+l].count(1):
            return s[i:i+l],i
    else:return None

s = [1, 1, 0, 1, 1, 1, 1, 1, 0, 
     1, 1, 0, 0, 1, 1, 0, 1, 0, 0,
     1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]
     
l = 10

print(check(seq,l))
([0, 1, 1, 0, 0, 1, 1, 0, 1, 0], 8)

第 8 个元素开始连续 10 个恰好包含 5个叉和5个勺。

课程设计:丁丁猫亲子创客

本节课两个任务场景激发编程的动力,适于小学6年级以上的孩子;

锻炼孩子遇到实际场景需求,先抽象为可用编程实现的思维过程;

熟悉并使用python数组的切片、数组元素统计函数使用;

使用英文描述和理解问题需求,掌握两个math里常见的单词 consecutive in the line-up

理解f(n)函数的本质,用函数描述问题的好习惯;

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机丢失msvcr110.dll解决办法,多种msvcr110.dll解决方法分享

随着 Windows 操作系统的发展&#xff0c;越来越多的用户在使用电脑时遇到了计算机丢失 msvcr110.dll 的问题。msvcr110.dll 是 Windows 操作系统中的一个动态链接库文件&#xff0c;它包含了许多常用的 C 运行库函数。因此&#xff0c;当计算机丢失 msvcr110.dll 时&#xff0…

Kotlin File useLines nameWithoutExtension extension

Kotlin File useLines nameWithoutExtension extension import java.io.Filefun main(args: Array<String>) {val filePath "myfile.txt"val file File(filePath)println(file.name) //文件名字&#xff0c;不包括路径println(file.isFile) //是文件吗pri…

PTA:7-4 顺序表(删除)

顺序表&#xff08;删除&#xff09; 题目输入样例输出样例 代码 题目 输入样例 10 55 11 9 15 67 12 18 33 6 22 10 20输出样例 55 9 67 33 6 22代码 #include<iostream> using namespace std; void deletes(int* arr, int& sz, int left, int right) {int newId…

Vue入门简介(带你打开Vue的大门)

目录 前言 一、Vue简介 1. 什么是Vue 2. Vue的应用场景 3. Vue的作用&#xff08;重要性&#xff09; 4. 什么是MVVM模式 5. 开源库网址 二、Vue入门使用 1. 基础使用步骤 1.1 引入Vue.js 1.2 创建Vue实例 1.3 编写Vue模板 1.4 数据绑定与指令 1.5 调用Vue方法和…

【C++】哈希位图和布隆过滤器

哈希位图优缺点位图应用模拟实现代码 哈希布隆过滤器哈希布隆过滤器的提出哈希布隆过滤器概念模拟实现代码 为什么哈希布隆图要比位图省空间 哈希位图和布隆过滤器都是常用的概率数据结构&#xff0c;用于高效地判断一个元素是否存在于一个集合当中&#xff0c;但它们在实现方法…

The driver has not received any packets from the server

在测试数据迁移时遇到的错误。 目录 一、错误 二、解决 三、数据迁移测试 3.1 环境 3.2 源码及测试 3.2.1 源码 3.2.2 测试结果&#xff08;太慢&#xff09; 3.2.3 源码修改 3.2.4 异常及解决 一、错误 The driver has not received any packets from the server. 二…

关于软件测试的方法详解,你知道多少呢?

一、 软件测试方法 1. 软件测试方法包括&#xff1a;白盒测试(White Box Testing)、黑盒测试(Black Box Testing)、灰盒测试、静态测试、动态测试。 2. 白盒测试&#xff1a;是一种测试用例设计方法&#xff0c;在这里盒子指的是被测试的软件&#xff0c;白盒&#xff0c;顾名…

想要精通算法和SQL的成长之路 - 最长回文子序列

想要精通算法和SQL的成长之路 - 最长回文子序列 前言一. 最长回文子序列 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长回文子序列 原题链接 首先&#xff0c;我们看下动态规划方程的定义&#xff0c;我们用dp[i][j] 来代表&#xff1a;字符串s在下标区间为[i,j]之间…

Java“牵手”lazada商品列表页数据采集+lazada商品价格数据排序,lazadaAPI接口申请指南

Lazada是东南亚首屈一指的网上购物平台&#xff0c;中文名为来赞达&#xff0c;拥有较多的品牌和销售商。2016年&#xff0c;Lazada成为阿里巴巴集团的区域旗舰&#xff0c;并得到了阿里巴巴一流的技术基础设施的支持。 Lazada来赞达在2012年成立&#xff0c;总部设在新加坡&a…

JavaScript基础知识11——运算符:赋值运算符

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天公乌素这缺水的镇子&#xff0c;稀稀拉拉下了一天的雨&#xff0c;一场秋雨一场寒&#xff0c;风开始愈发清凉。 看日历发现明天就是二十四节气里的白露了&#xff0c;都白露了&#xff0c;原来不知不觉已经深秋了…

笔记(五)-传统图机器学习的特征工程-全图

1、引言 -提取出的特征要能够反应全图结构特点 2、全图信息种类 Bag-of-Nodes Bag-of-Nodes degrees -就是找同分异构体 -和节点特征的子图不同的是 可以存在孤立结点计算全图的子图个数&#xff0c;而不是特定邻域的子图个数 Graphlet kernel -两个图作数量积&#xff0c;…

Unity 安装及运行MLAgents

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…

如何修复丢失的vcruntime140_1.dll文件

在编程中&#xff0c;我们经常会遇到各种问题和挑战。其中之一就是缺少必要的运行库文件&#xff0c;如vcruntime140_1.dll&#xff0c;这可能会导致我们的程序无法正常运行。本文将详细介绍6种解决此问题的方法&#xff0c;并详细讲解vcruntime140_1.dll文件的作用。 vcruntim…

企业级SpringBoot单体项目模板 —— 全局配置

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot、模版、企业级☀️每日 一言&#xff1a;你坚持下来了&#xff0c;而别人坚持不下来&#xff0c;这就是你的资本。 文章目录 一、全局异常配置1.1 全局异常处理1.2 处理业务异常类1.3…

并查集 size 的优化

我们把如下图所示的并查集&#xff0c;进行 union(4,9) 操作。 合并操作后的结构为&#xff1a; 可以发现&#xff0c;这个结构的树的层相对较高&#xff0c;若此时元素数量增多&#xff0c;这样产生的消耗就会相对较大。解决这个问题其实很简单&#xff0c;在进行具体指向操作…

【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)

目录 一、实验目的 二、实验要求 三、实验内容与结果 四、实验心得 一、实验目的 1. 掌握求数值导数和数值积分的方法。 2. 掌握代数方程数值求解的方法。 3. 掌握常微分方程数值求解的方法。 二、实验要求 1. 根据实验内容&#xff0c;编写相应的MATLAB程序&#xff0c…

Java IO 之 BIO、NIO 和 AIO

一、IO IO 是 Input 和 Output 二词的缩写&#xff0c;意为输入和输出&#xff0c;直接来说&#xff0c;实现一般的 I/O 是没有什么难度的&#xff0c;但涉及到多线程时&#xff0c;要解决 I/O 的问题就不是一个简单的事情了&#xff0c;会涉及到同步和异步的问题&#xff0c;…

SSL加速是什么,有什么优势?

SSL加速技术是一种专门用于加速HTTPS通信的技术&#xff0c;它可以在服务器和客户端之间提供高效的加密和解密处理&#xff0c;以提升网络通信的安全性和性能。以下是SSL加速技术的一些主要优势&#xff1a; 提高网站的访问速度&#xff1a;SSL加速技术可以对SSL握手过程进行优…

1143. 最长公共子序列(C++实现)

1143. 最长公共子序列https://leetcode.cn/problems/longest-common-subsequence/ int longestCommonSubsequence(string text1, string text2) {int m text1.size(), n text2.size();vector<vector<int>> dp(m 1, vector<int>(n 1));for (int i 0; i …

C++文件操作示例

C 标准库提供了 3 个类用于实现文件操作&#xff0c;它们统称为文件流类&#xff0c;这 3 个类分别为&#xff1a; ifstream&#xff1a;专用于从文件读取数据 ofstream&#xff1a;专用于向文件写入数据 fstream&#xff1a;可读可写 这三个文件流类都位于 fstrea…