每天一道C语言编程:排队买票

题目描述

有M个小孩到公园玩,门票是1元。其中N个小孩带的钱为1元,K个小孩带的钱为2元。售票员没有零钱,问这些小孩共有多少种排队方法,使得售票员总能找得开零钱。注意:两个拿一元零钱的小孩,他们的位置互换,也算是一种新的排法。(M<=10)

输入格式

输入一行,M,N,K(其中M=N+K,M<=10).

输出格式

输出一行,总的排队方案。

样例输入

4 2 2

样例输出

8
方法一:

题目分析:
由题目可知,必须满足条件N>=K,拆分这个条件:

N=K

N个小孩带的钱为1元,另外N个小孩带的钱为2元,即2N=M,可以直接用卡特兰数:

由于题目中说小孩交换位置算一种新的排队方式,所以还要再乘上 n 的全排列(乘两遍:N个小孩带的钱为1元,另外N个小孩带的钱为2元),即

K(n)=\frac{C_{2n}^{n}}{n+1}\times n!\times n!

N>K 

先将非法的排列方法筛选出来,再用总的排列方法-非法的排列方法,得最终排列的方法数:

总的排列方法:
因为由M人,所以总的排列方法有M!

非法的排列可以将其分为三个部分:

  • 前 2P 个小孩
  • 第 2P + 1 个小孩
  • 剩下的小孩,假设共 R 个(R = M - 2P - 1)

第一部分可以使用卡特兰公式进行运算,即,其中p在0~k范围内,但不能为K,因为第二部分必须为K中的一部分

其次,p可以为0,因为第二部分2p+1为持有2元的小孩,即第一个排队的人就是持有2元的小孩,也是非法的排列顺序:

\sum_{P=0}^{K-1}K(P)A_{N}^{P}A_{K}^{P}

由于第一部分已经用了k中的p个,第二部分有k-p个选择:

K-P

 第三部分随意排列,即r=m-2*p-1进行随意排列:

R!

所以合法的排列公式为:

M!-\sum_{P=0}^{K-1}K(P)A_{N}^{P}A_{K}^{P}(K-P)R!

用代码实现即:

 long long sum = 0;for (int p = 0; p <k; p++) {int r = m - 2 * p - 1;long long fail = catalan(p) * rank(k, p) * rank(n, p) * (k - p) * rank(r, r);sum += fail;}long long result = rank(m, m) - sum;printf("%lld\n", result);

所以完整的代码得,如果其中有一些小漏洞,请大佬们不吝赐教!💖💖

#include<stdio.h>// 求排列数
long long rank(int a1, int a2) {if (a2 == 0) return 1;a2--;//这里一定不能忘记,因为要排除rank(c1,c2)中,c1为0得情况long long pro = a1;for (int i = 0; i < a2; i++) {a1--;pro *= a1;}return pro;
}// 求组合数
long long comb(int c1, int c2) {return rank(c1, c2) / rank(c2, c2);
}// 求卡特兰数
long long catalan(int n) {return comb(2 * n, n) / (n + 1);
}int main() {int m, n, k;scanf("%d %d %d", &m, &n, &k);if (n < k) {printf("Error: n must be greater than or equal to k.\n");return 0;}else {long long sum = 0;for (int p = 0; p <k; p++) {int r = m - 2 * p - 1;long long fail = catalan(p) * rank(k, p) * rank(n, p) * (k - p) * rank(r, r);sum += fail;}long long result = rank(m, m) - sum;printf("%lld\n", result);}return 0;
}
方法二

我在网上也看到一种更简便得方法,在这里分享给大家,我的理解如下:

他利用了数据结构中的next_permutation(a,a+N)方法进行全排列,不熟悉的可以看这篇文章:

http://t.csdn.cn/TREc9

我们可以把它理解为序列的字典序的前后,严格来讲,就是对于当前序列pn,他的下一个序列pn+1满足:不存在另外的序列pm,使pn<pm<pn+1

正确的排列方法为:每个2前面至少对应着一个1

用一个num记录,num如果有1就++,有2就- - ,如果过程中num<0则证明存在有一个2没有一个1对应。

代码为:

这里初始前面的1为0~K-1,后面的2为K~N-1 所以小于K的就相当于是1了,大于K的就相当于是2了,为了方便使用next_permutation()

 for (int i=0; i<K; i++) {a[i] = i;}for (int i=K; i<N; i++) {a[i] = i;}do {int flag = 0;// check每个全排列, num务必要初始化 int num = 0;for (int i=0; i<N; i++) {if (a[i] >= K) {num--;} else {num++;}if (num < 0) {flag = 1;break;}}if (flag == 0) {
//                for (int i=0; i<N; i++) {
//                    cout << a[i];
//                }
//                cout << "\n";res++;}

这还不够,需要判断类似1122的所有全排列包括重复的,因为初始前面的1为0~K-1,后面的2为K~N-1 ,对于0123的序列我们可以直接使用next_permutation(),完整代码如下:

#include <iostream>
#include <algorithm>
using namespace std;
int N, K, M;
int main() {while (cin >> N >> K >> M) {int a[N], res = 0;for (int i=0; i<K; i++) {a[i] = i;}for (int i=K; i<N; i++) {a[i] = i;}do {int flag = 0;// check每个全排列, num务必要初始化 int num = 0;for (int i=0; i<N; i++) {if (a[i] >= K) {num--;} else {num++;}if (num < 0) {flag = 1;break;}}if (flag == 0) {
//                for (int i=0; i<N; i++) {
//                    cout << a[i];
//                }
//                cout << "\n";res++;}} while (next_permutation(a,a+N));cout << res << "\n";}return 0;
}

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

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

相关文章

精益生产有哪些管理工具?

精益生产有哪些管理工具&#xff1f; 一、什么是精益生产 智能制造是落实我国制造强国战略的重要举措&#xff0c;加快推进智能制造&#xff0c;是加速我国工业化和信息化深度融合、推动制造业供给侧结构性改革的重要着力点&#xff0c;对重塑我国制造业竞争新优势具有重要意义…

优化类问题建模解析

模型建立阶段 线性规划模型&#xff1a;目标函数和约束条件均为线性 整数规划或0-1规划&#xff1a;决策变量取值被限制为整数或0、1 动态优化模型&#xff1a;以时间为划分阶段的动态过程优化问题 非线性规划模型&#xff1a;目标函数或约束条件中包括非线性函数 多目标规划模…

超高性能协议框架fury完爆protostuff(附性能测试对比)

简单介绍: 序列化框架是系统通信的基础组件&#xff0c;在大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时&#xff0c;都需要进行序列化&#xff0c;其性能和易用性影响运行效率和开发效率。 Fury 是一个基于…

SSH服务(二十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、特点 三、身份验证机制 四、验证过程 五、加密机制 六、基本参数 ​七、 身份验证机制 八、基本操作 1. ssh 2. scp 3. sftp 4. 密钥对验证 总结 前…

人工智能商业变现途径,并介绍详细公司案列

目录 1. 推荐系统&#xff1a;2. 智能广告和营销&#xff1a;3. 聊天机器人和虚拟助手&#xff1a;4. 自动化和机器人化&#xff1a;5. 数据分析和预测&#xff1a;6. 机器视觉和图像识别&#xff1a;7. 金融科技&#xff08;FinTech&#xff09;&#xff1a;8. 医疗诊断和健康…

m4a文件出现损坏应该如何修复?

M4A文件&#xff0c;也称为Apple Lossless Encoder&#xff0c;是一种类似于MP4文件的音频格式。它们之间唯一的区别是M4A文件里面没有视频。作为一个音频文件&#xff0c;它已被广泛使用&#xff0c;常用的Windows&#xff0c;Media Player&#xff0c;Mac quicktime和iTunes等…

【MongoDB实战】数据备份与恢复(部分迁移)

场景&#xff1a; 需求&#xff1a; 解决方案&#xff1a; 步骤&#xff1a; Stage 1&#xff1a;【生产环境】修改备份文件映射 Stage 2&#xff1a;【生产环境】重新构建mongodb Stage 3&#xff1a;【客户环境】修改备份文件映射&#xff0c;同 Stage 1 Stage 4&…

九五从零开始的运维之路(其二十)

[TOC](文章目录) 文章目录 前言一、LAMP是什么二、配置环境及安装1.配置yum源2.关闭防火墙、网络图形化工具及SElinux3.安装软件包 三、配置apache服务器内容四、启动服务五、访问验证总结 前言 本篇将简述的内容&#xff1a;Linux系统下的LAMP平台部署 基于discuz框架的论坛搭…

用WooCommerce创建一个多用户商城系统和多供应商市场

线上市场是下一波数字化商务。2020 年&#xff0c;超过60% 的线上支出是通过数字市场发生的。人们喜欢从市场上购物&#xff0c;因为它们使购物变得容易。出于同样的原因&#xff0c;企业喜欢通过它们进行销售。通过多用户商城系统和多供应商WooCommerce商城设置&#xff0c;每…

kafka接收外部接口的数据,并实现转发

目录 一、什么是kafka 二、kafka接收外部接口数据 三、kafka收到数据后转发 四、kafka总结 一、什么是kafka Kafka是一种分布式流式处理平台&#xff0c;最初由LinkedIn开发。它设计用于高吞吐量、低延迟的数据处理&#xff0c;能够处理大规模的实时数据流。Kafka采用发布…

gitee 使用

1.打开git bash 2.cd 进入到合适位置 3.git clone 项目 4.配置用户名和email&#xff08;不然没法记录谁操作的&#xff09; pycharm &#xff08;ctrlk&#xff09;

个人微信机器人开发

微信机器人的主要职责是为了帮助群主来进行微信社群的管理&#xff0c;微信机器人当前主要分为两种&#xff0c;一种是微信聊天机器人&#xff0c;还有一种是微信群管理机器人。 微信聊天机器人的主要职责是可以在群内聊天&#xff0c;从而提高微信群活跃度&#xff1b;微信群管…

【Ceph集群应用】CephFS文件系统之MDS接口详解

CephFS文件系统之MDS接口详解 1.创建CephFS文件系统MDS接口1.1 创建cephfs1.2 基于内核的客户端挂载1.3 基于fuse工具方式的客户端挂载 接上文基于ceph-deploy部署Ceph集群详解 1.创建CephFS文件系统MDS接口 服务端操作 &#xff08;1&#xff09;在admin管理节点创建mds服务…

Java打怪升级路线的相关知识

第一关:JavaSE阶段 1、计算机基础 2、java入门学习 3、java基础语法 4、流程控制和方法 5、数组 6、面向对象编程 7、异常 8、常用类 9、集合框架 10、IO 11、多线程 12、GUI编程 13、网络编程 14、注解与反射 15、JUC编程 16、JVM探究 17、23种设计模式 18、数据结构与算法 1…

PowerDesigner 数据库建模使用详解

目录 一、前言 二、PowerDesigner概述 2.1 PowerDesigner核心能力 2.1.1 集成多种建模能力 2.1.2 自动生产代码能力 2.1.3 强大的逆向工程能力 2.1.4 可扩展的企业库解决方案 2.2 PowerDesigner常用的几种模型 2.2.1 概念模型 2.2.2 逻辑数据模型 2.2.3 物理模型 2.2…

学习AJAX

AJAX &#x1f680; HTTP请求报文响应报文 &#x1f684; express框架&#x1f6ac; express基本使用 &#x1f692; 原生AJAX&#x1f6ac; GET.HTML&#x1f6ac; POST.HTML&#x1f6ac; JSON.HTML&#x1f6ac; nodemon工具可以帮助重启服务&#x1f6ac; IE缓存问题&#…

ELK 企业级日志分析系统(四)

ELK 一、部署Kafka集群二、Kafka的命令行操作三、Kafka架构深入四、FilebeatKafkaELK部署 一、部署Kafka集群 1.下载安装包 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html cd /opt wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.7.1/kafka_2…

铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【关于C++中----特殊类设计和单例模式】

文章目录 一、设计一个类&#xff0c;不能被拷贝1.1C98的实现方法及其弊端1.2 C11的实现方法 二、设计一个类&#xff0c;只能在堆上创建对象三、设计一个类&#xff0c;只能在栈上创建对象四、设计一个类&#xff0c;不能被继承五、设计一个类&#xff0c;只能创建一个对象(单…

Leecode316: 去除重复字母

下面这里使用有序map——TreeMap来实现Map接口&#xff0c;但是相对顺序是不能改变的&#xff01;这样会使得后面的跑到前面去&#xff0c;所以有问题 最简单的思想肯定是暴力思想&#xff0c;就是从前往后寻找&#xff0c;一旦遇到存在的情况就. 重点在于明确两点&#xff1a…