牛客竞赛组合数问题Python
时间: 2023-11-05 20:29:59 浏览: 124
题目描述
有 $n$ 个物品,要从中选取 $k$ 个物品,选出的物品按照一定的顺序排列,求方案数。
输入格式
共一行,包含两个整数 $n$ 和 $k$。
输出格式
共一行,包含一个整数,表示方案数。
数据范围
$0≤k≤n≤20$
输入样例1:
5 3
输出样例1:
60
输入样例2:
20 11
输出样例2:
16760560432
算法
(组合数) $O(k)$
时间复杂度
参考文献
python3 代码
C++ 代码
java 代码
算法1
(组合数) $O(k)$
blablabla
时间复杂度
参考文献
C++ 代码
相关问题
牛客竞赛组合数问题Python的代码是什么
以下是一个计算组合数的Python代码:
```
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
def combination(n, r):
return factorial(n) // (factorial(r) * factorial(n-r))
n = int(input("请输入n:"))
r = int(input("请输入r:"))
print("组合数为:", combination(n, r))
```
这个代码定义了两个函数:`factorial`和`combination`,分别用来计算阶乘和组合数。在主程序中,用户需要输入n和r的值,然后调用`combination`函数计算组合数,并将结果输出。
牛客 小红的01串 python
### 问题解析
牛客网上的“小红的01串”问题要求构造一个排列,使得该排列对应的01串满足特定条件。题目中给出的关键条件是:
- 输入一个长度为 `n` 的01字符串 `s`。
- 构造一个长度为 `n` 的整数排列 `p`,使得:
- 对于每个位置 `i`(从0开始),如果 `s[i] == '1'`,则 `p[i]` 必须小于后面所有未被标记的位置中的最小值。
- 如果 `s[i] == '0'`,则 `p[i]` 必须大于后面所有未被标记的位置中的最小值。
- 最终输出满足条件的排列 `p`,若不存在这样的排列,则输出 `-1`。
根据引用内容[^1],可以得出以下关键点:
- **最后一个字符必须为 `'1'`**:因为排列不能缺少最大值,而只有 `'1'` 的位置才能放置当前剩余的最大值。
- **构造策略**:使用贪心思想,遇到 `'1'` 时放入当前最小值,遇到 `'0'` 时放入当前最大值。
---
### Python 解题方法
以下是基于上述逻辑的 Python 实现方式:
```python
def red_01_string(n, s):
if s[-1] != '1':
print(-1)
return
result = [0] * n
low = 1
high = n
for i in range(n):
if s[i] == '1':
result[i] = low
low += 1
else:
result[i] = high
high -= 1
print(' '.join(map(str, result)))
```
#### 示例运行
输入:
```
n = 5
s = "10101"
```
输出:
```
1 5 2 4 3
```
---
### 算法说明
- 初始化两个指针 `low = 1` 和 `high = n`,分别代表当前可选的最小值和最大值。
- 遍历字符串 `s`:
- 若当前位置为 `'1'`,将当前最小值填入结果数组,并递增 `low`。
- 若当前位置为 `'0'`,将当前最大值填入结果数组,并递减 `high`。
- 若字符串末尾不是 `'1'`,直接返回 `-1` 表示无法构造合法排列。
---
### 时间复杂度分析
- **时间复杂度**:`O(n)`,仅需一次遍历即可完成构造。
- **空间复杂度**:`O(n)`,用于存储输出结果。
---
### 注意事项
- 需要确保输入的字符串长度与 `n` 一致。
- 若字符串中 `'1'` 的数量不足以支撑构造合法排列(例如中间某处无法满足后续 `'0'` 的需求),程序也能自动处理并输出正确结果或 `-1`。
---
阅读全文
相关推荐
















