【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解

题目传送门

题解

CSP-S1 补全程序,致敬全 A 的答案,和神奇的预言家。

写一下这篇的题解说不定能加 CSP 2024 的 RP

首先看到 k k k 这么大的一个常数,就想到了二分。然后写一个判断的函数:枚举 A A A 序列里面的数,然后再找 B B B 序列能和 A A A 序列里选出来的数加起来之和小于等于 t t t 即可。

但是,这样的话可能会超时,所以,我们把 B B B 序列的循环改成二分,注意要二分必须在有序的情况下,所以提前排序。时间复杂度 O ( n log ⁡ m ) O(n \log m) O(nlogm)

不开 long long 见祖宗!!!

代码

#include <bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define int long long
namespace fastIO {
	inline int read() {
		register int x = 0, f = 1;
		register char c = getchar();
		while (c < '0' || c > '9') {
			if(c == '-') f = -1;
			c = getchar();
		}
		while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
		return x * f;
	}
	inline void write(int x) {
		if(x < 0) putchar('-'), x = -x;
		if(x > 9) write(x / 10);
		putchar(x % 10 + '0');
		return;
	}
}
using namespace fastIO;
int n, m, k, a[100005], b[100005]; 
bool check (int x) {
	int res = 0;
	for (int i = 1; i <= n; i++) {
		res += upper_bound (b + 1, b + m + 1, x - a[i]) - b - 1;
	}
	return res >= k;
}
signed main() {
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n = read(), m = read(), k = read();
	for(int i = 1; i <= n; i ++) {
		a[i] = read();
	}
	for(int i = 1; i <= m; i ++) {
		b[i] = read();
	}
	sort(b + 1, b + m + 1);
	int l = 0, r = INT_MAX;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (check (mid)) {
			r = mid;
		}
		else l = mid + 1;
	}
	write(l);
	return 0;
}
<think>好的,我现在需要帮助用户查找蓝桥杯竞赛中与“爬树的甲虫”相关的题目或算法题解。根据用户提供的引用资料,引用[1]提到了洛谷题目P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫的题解,看起来这题涉及到概率动态规划。用户的问题可能与此题相关,需要详细解析。 首先,我需要确认用户提到的“爬树的甲虫”是否对应引用[1]中的题目。题目标签显示是2022年蓝桥杯省A题目,用户可能希望了解该题目的解题思路算法应用。根据引用内容,甲壳虫在爬树过程中有概率失败并掉回树根,需要计算期望时间。这通常涉及动态规划或概率期望模型。 接下来,我需要检查引用中的具体内容。引用[1]提到建立状态转移方程,这说明该题解可能使用动态规划方法。状态转移方程是动态规划的核心,所以需要详细解释状态定义方程推导。 另外,用户可能希望了解如何将此类问题转化为数学模型,以及具体的算法实现步骤。例如,如何定义状态、推导递推公式,以及如何处理概率问题。引用中提到的“总共花费的时间”可能涉及到期望值的计算,可能需要使用马尔可夫链或递推关系。 同时,考虑到用户可能对蓝桥杯的其他算法问题也感兴趣,比如引用[2]中的石子合并问题使用GarsiaWachs算法,引用[3]中的积木画问题使用动态规划,这些都属于竞赛中常见的算法类型。但用户当前的问题集中在爬树的甲虫题解,所以需要优先处理该部分。 用户的需求可能包括题目的详细分析、算法思路、状态转移方程的建立以及代码实现。需要确保回答结构清晰,分步骤解释,并引用提供的参考资料。同时,用户可能希望了解该题在蓝桥杯中的考察重点,例如动态规划的应用或概率问题的处理技巧。 最后,生成相关问题时应围绕动态规划、概率期望模型、类似题型扩展等方面,帮助用户进一步学习相关知识点。例如,如何分析动态规划的时间复杂度,或者优化方法等。 总结回答结构应包括题目解析、算法思路、状态转移方程推导、代码示例以及相关问题推荐,确保引用正确来源,并符合用户要求的格式语言规范。</think>### 蓝桥杯“爬树的甲壳虫”题解算法解析 根据引用[1]的描述,该题目属于**概率期望模型与动态规划**的结合应用,以下是详细分析: --- #### **题目核心分析** 甲壳虫从树根(高度0)向树顶(高度n)攀爬,每次从高度$i$到$i+1$时: - 成功概率为$p_i$,耗时1单位时间; - 失败概率为$1-p_i$,掉回树根,总耗时为$i+1 + E$(其中$E$为重新从树根到高度$i$的期望时间)。 **目标**:计算从树根到树顶的总期望时间。 --- #### **算法思路** 1. **状态定义** 设$dp[i]$表示从高度$i$到树顶的期望时间,则最终答案为$dp[0]$。 2. **状态转移方程** 在高度$i$时,甲壳虫有两种选择: - 成功:耗时1,进入$dp[i+1]$; - 失败:耗时$i+1 + dp[0]$(掉回树根后需重新计算$dp[0]$到$dp[i]$的时间)。 根据期望公式: $$ dp[i] = p_i \cdot (1 + dp[i+1]) + (1-p_i) \cdot (i+1 + dp[0]) $$ 但方程中存在**循环依赖**($dp[i]$依赖$dp[0]$),需通过数学变换消除[^1]。 3. **递推关系优化** 引入新变量$f[i] = dp[0] - dp[i]$,通过递推消去$dp[0]$,最终得到: $$ dp[0] = \sum_{k=0}^{n-1} \frac{1 + (k+1) \cdot (1-p_k)}{p_k} \cdot \prod_{j=0}^{k-1} \frac{1-p_j}{p_j} } $$ 具体推导需利用级数求与概率乘积特性。 --- #### **代码实现示例(Python)** ```python n = int(input()) p = list(map(float, input().split())) # 各高度成功概率 result = 0 product = 1 # 累积概率乘积项 for k in range(n): pk = p[k] term = (1 + (k+1) * (1 - pk)) / pk result += term * product product *= (1 - pk) / pk print("{:.2f}".format(result)) ``` --- #### **算法应用场景** 1. **概率期望问题**:如游戏中的随机事件计算、网络传输重传机制分析。 2. **动态规划优化**:通过变量替换消除循环依赖,适用于马尔可夫链模型。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值