2023年北京素养赛Python复赛题

第1题,求余数
题目描述:
输入一个正整数,输出这个整数除以5的余数。
输入描述:
输入一行一个正整数
输出描述:
输出这个整数除以5的余数
样例1:
输入:
12
输出:
2

第2题,最大身高差
题目描述:
上了初中之后,很多同学身高都开始迅速增长,不过有的同学生长发育的早一些,有的同学会晚一些。
现在学校的生理健康老师想统计一下班级里面学生身高的最大跨度值(最大跨度值=身高最大值-身高最小值)。
任意输入一行整数,中间用空格间隔,输出身高最大跨度值。
输入描述:
输入一行整数,中间用空格间隔。
林福容
输出描述:
输出身高最大跨度值。
样例1:
输入:
168 152 140 179 155 162 172
输出:
39

第3题,重复字符
题目描述:
输入一个字符串s,将s中的每个字符都重复一次,然后输出这个新的字符串,例如,当s="abc"时,输出"aabbcc"。
输入描述:
输入一个字符串s.
输出描述:
输出一个新的字符串。
样例1:
输入:
abcd
输出:
aabbccdd

第4题,出租车费用
题目描述:
某市出租车的计费标准是:
起步价(3千米以内,包括3千米) 14元,以后每超过1千米(不足1千米的按1千米计算)另加价3元。
小可家到学校距离n千米,他打车需要多少钱?

输入描述:
输入一个数n表示小可家到学校距离。
输出描述:
输出打车的费用。
样例1:
输入:
8.8
输出:
32

第5题,分钱方案
题目描述:
有n个人,他们需要分配m元钱 (m >=n),每个人至少分到1元钱,且每个人分到的钱数必须是整数。请问有多少种分配方案?

输入描述:
输入一行两个正整数n, m, 用空格间隔。
输出描述:
输出分配方案数。
样例1:
输入:
5 10
输出:
126

解析一数学排列组合:
十元钱分给五个人,那么实际上就是把十个一元分成五份,这个可以用数学插板法,那么相当于9个空位,要放置4个板。C9 4。
因为排列组合C9 4=C9 5所以如果数据是大的5,可以转换成4来算的。

#include <iostream>
using namespace std;
/*
看样例,5个人份10元,有126种分法。
一般分法为10个数分为五份,即九个位置中间插入四个板。
即C9 4=9*8*7*6/(4*3*2*1)=18*7=126
那么这道题就是按照这个分法来处理即可。
*/
int main() {
	int n, m;
	cin >> n >> m;
	m--;
	n--;
	if (m - n < n) { //C 9 4=C 9 5
		n = m - n;
	}
	long long result1 = 1, result2 = 1;
	for (int i = 1; i <= n; i++) {
		result1 *= (m + 1 - i);
		result2 *= i;
	}
	cout << result1 / result2 << endl;
	return 0;
}

解析二递归:
根据样例,这道题的方案,每个人都是不同的个体,n, m=2, 3,结果是2,因为有两种情况分别是1 2和2 1。如果是相同的,那么n, m=5, 10不会有126这么多的。
状态转移方程f(n, m)表示n个人分m元钱的分配方案,那么前一个f(n-1, ?) n-1个人的分配方案,是如何转变为f(n, m)。
第n个人分配钱数的方案为:【1, m-n+1】因为必须要有一元。那么f(n-1, m-[1, m-n+1])的总和即为f(n)的值。

def f(n, m):
    if m < n:
        return 0
    if n == 1:
        return 1
    _sum = 0
    for i in range(1, m - n + 2):
        _sum += f(n - 1, m - i)
    return _sum


n, m = map(int, input().split())
print(f(n, m))

第6题,错排问题
题目描述:
圣诞节快到了,公司为每个员工都准备了礼物,每个礼物都有一个精美的盒子。如果所有的礼物都不小心装错了盒子,求所有礼物都装错盒子共有多少种不同情况。
输入描述:
输入一个正整数n表示公司人数,保证n≤20.
输出描述:
输出一个整数,代表有多少种情况。
样例1:
输入:
2
输出:
1

解析:
模拟:
n=1,有0种情况;
n=2,有1种情况;
n=3的时候,有两种情况:
3 1 2
2 3 1
n=4的时候,有9种情况
原定顺序是1 2 3 4
当1选择2的位置
2 1 4 3
4 1 2 3
4 1 3 2
当1选择3的位置
2 4 1 3
4 3 1 2
3 4 1 2
当1选择4的位置
2 3 4 1
3 4 2 1
4 3 2 1
动态转移方程f(n)表示n个礼物装错盒子,
第一反应感觉式子应该是如下:
第n个礼物装错盒子的选择有n-1种,f(n)=(n-1)f(n)
但是f(4)!=(4-1)
f(3)
因为f(n)和f(n-1)之间还有一些差异在于,
因为第n个礼物一旦占据了n-1箱子中的第m号,
那么m号假定放置于n号箱子,现在开始错排,
假设m号不能放于n号,情况即为f(n-1)。
但是m号可以放于n号,当m放在n号的时候,存在f(n-2)。


def f(n):
    if n == 1:
        return 0
    if n == 2:
        return 1
    return (n - 1) * (f(n - 1) + f(n - 2))


n = int(input())
print(f(n))

posted @ 2024-06-16 15:48  Danlis  阅读(41)  评论(0编辑  收藏  举报