梦熊 NOIP第一场题解

P11267 【MX-S5-T1】王国边缘

原题链接

这道题做的时候看出来了是基环树,但没想到倍增,用特殊性质过了 20 p t s 20pts 20pts,该说不说,梦熊的题确实很难。

老样子,简化题意:

给定一个长度为 n 的 01 01 01字符串 T = S ∞ 。 T = S∞。 T=S
一个人在 T T T 上移动。他的一次移动为:设当前下标为 x x x,则跳
[ x + 1 , x + m ] [x + 1, x + m] [x+1,x+m] 中最后一个为 1 1 1 的位置,如果区间中不存在 1 1 1则移动至 x + 1 x + 1 x+1。有 q 次询问,每次询问给定 x , y x, y x,y,求从 x x x 开始移动 y y y 次后的下标对 1 0 9 + 7 10^9 + 7 109+7 取模的值。

分析思路

先考虑对于
1 ∼ n 1\sim n 1n中的每个点往后跳一次会跳多少距离。

那么我们来想一下,为什么我们只需要考虑 1 ∼ n 1\sim n 1n的点,而不需要找别的距离。

我们能发现,由于字符串是无限循环的,所以1对于位置模上 n n n的结果相同时,那么往后跳的距离也是相同的。

我们可以先将字符串断成环成链倍长后做前缀和来处理 l ∼ r l\sim r lr中的 1 1 1的数量。

然后很容易想出二分得出往后跳的距离。

然后我们就可以求出对于每个点 i i i往后可以跳跃的距离。

然后问题询问的是往后跳 k k k次的最终位置。

经典的倍增,但我就是没看出来,寄了。

c o d e code code

T2 P11268 【MX-S5-T2】买东西题

原题链接

这道题本来想打特殊性质的,感觉生活应用题都还好想一点,但还是打寄了,哎。(っ °Д °;)っ

简化题意:

你要买 n n n个物品,第 i i i个物品原价 a i a_i ai,折扣价 b i b_i bi
你还有 m m m 个优惠券,第 i i i 个优惠券形如原原原价价价满 w i w_i wi v i v_i vi
对于第 i i i 个物品,你可以选择以下三种购买方式之一:

  1. 使用原价 a i a_i ai 购买。
  2. 使用折扣价 b i b_i bi 购买。
  3. 选择一个优惠券 j j j,要求满足 a i ≥ w i a_i\ge w_i aiwi,使用优惠券 j j j,以 a i − v j a_i-v_j aivj 的价格购买。

注意每个优惠券 j j j只能被最多一个 i i i使用。
求购买所有物品最少用钱。

解题思路:

可以这样理解: a a a元的物品有 b b b元的折扣,就相当于 a a a元的物品有一张 a − b a-b ab的优惠券。
因为一张优惠券是满 w w w元才可以用,所以可以用的物品在价格 a a a上是一段区间 [ a , inf ⁡ ] [a,\inf] [a,inf]

有一个很朴素的想法是,将每一个物品最多能省多少钱先弄出来,然后用优惠券想办法把省的最小的钱换成优惠券。

先将物品和优惠券按满多少可以有优惠排序,再枚举优惠券,最后就是按照上面说的逐步加进去就好了。

想要快速求出最小值可以用优先队列,如果到最后还用不到优惠券的记得把打得折加进去。

时间复杂度还是很优的,仅要 O ( n l o g n ) O(n log n) O(nlogn)

c o d e code code

#include<bits/stdc++.h>
#define int long long
#define maxn 1000050
#define gll greater<int>
#define vll vector<int>
using namespace std;
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
		x = x * 10 + ch - '0', ch = getchar();
	return x * f;
}
int n, m;
struct node {
	int x, y;
} a[maxn], b[maxn];
bool cmp(node a, node b) {
	//不能写成下面的形式,会爆范围
//	if(a.x==a.y) return a.y>b.y;
//	else return a.x>b.x;
	return a.x == b.x ? a.y > b.y : a.x > b.x;
}
int res = 0;
priority_queue<int, vll, gll > q;
signed main() {
	n = read(), m = read();
	for (int i = 1; i <= n; i++) {
		int x, y;
		x = read();
		y = read();
		a[i].x = x, a[i].y = x - y;
		res += a[i].x;
	}
	for (int i = 1; i <= m; i++) {
		b[i].x = read(), b[i].y = read();
	}
	int i = 1;
	sort(a + 1, a + n + 1, cmp);
	sort(b + 1, b + m + 1, cmp);
	for (int j = 1; j <= m; j++) {
		while (i <= n && a[i].x >= b[j].x) {
			q.push(a[i].y);
			i++;
		}
		if (q.size() && q.top() < b[j].y) {
			q.pop();
			q.push(b[j].y);
		}
	}
	while (i <= n) {
		q.push(a[i].y);
		i++;
	}
	while (q.size()){
		res -= q.top();
		q.pop();
	}
	cout << res;
	return 0;
}

T3 P11269 【MX-S5-T3】IMAWANOKIWA (Construction ver.)


原题链接

题目太复杂,表示读懂稍许困难。

简化题意:

给你一个初始长度为 n n n,只包含 0 , 1 , 2 0, 1, 2 0,1,2 的序列 a 1 ∼ n a_1∼n a1n,你每次可以选择两个相邻的数 p , q p, q p,q,删去它们,并在原位置插入
p o p c ( p + q ) 。 popc(p + q)。 popc(p+q)其中, p o p c ( x ) popc(x) popc(x) 表示 x x x在二进制表示下 1 1 1 的个数。

显然每次操作后序列长度都会减少 1 1 1,所以执行 n − 1 n − 1 n1 次操作
后,这个序列会恰好剩下一个数。请你最小化剩下的这个数,并
给出字典序最小的操作位置序列。

题目思路:

T4

简化题意:

n + m n + m n+m 个括号序列,分别是 S 1 , S 2 , S 3 , . . . , S n S1, S2, S3, . . . , Sn S1,S2,S3,...,Sn
T 1 , T 2 , T 3 , . . . , T m 。 T1, T2, T3, . . . , Tm。 T1,T2,T3,...,Tm

对一个括号序列 A , f ( A ) A,f(A) Af(A)为满足以下条件的 ( i , j ) (i, j) (i,j) 对数:
1. i ∈ [ 1 , n ] , j ∈ [ 1 , m ] ; 1.i ∈ [1, n],j ∈ [1, m]; 1.i[1,n]j[1,m];
2. S i 2.Si 2.Si A A A 的前缀且 T j Tj Tj A A A 的后缀。

求所有长度为 k k k 的合法括号序列 S , f ( S ) S,f(S) Sf(S) 的和。答案对
1 0 9 + 7 10^9 + 7 109+7 取模。
保证 k 为偶数。
$$$$$$$$$$$$$$$$$$$$$$$$$$$$

内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,涵盖正向与逆向运动学求解、正向动力学控制,并采用拉格朗日-欧拉法推导逆向动力学方程,所有内容均通过Matlab代码实现。同时结合RRT路径规划与B样条优化技术,提升机械臂运动轨迹的合理性与平滑性。文中还涉及多种先进算法与仿真技术的应用,如状态估计中的UKF、AUKF、EKF等滤波方法,以及PINN、INN、CNN-LSTM等神经网络模型在工程问题中的建模与求解,展示了Matlab在机器人控制、智能算法与系统仿真中的强大能力。; 适合人群:具备一定Ma六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)tlab编程基础,从事机器人控制、自动化、智能制造、人工智能等相关领域的科研人员及研究生;熟悉运动学、动力学建模或对神经网络在控制系统中应用感兴趣的工程技术人员。; 使用场景及目标:①实现六自由度机械臂的精确运动学与动力学建模;②利用人工神经网络解决传统解析方法难以处理的非线性控制问题;③结合路径规划与轨迹优化提升机械臂作业效率;④掌握基于Matlab的状态估计、数据融合与智能算法仿真方法; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解运动学建模与神经网络控制的设计流程,关注算法实现细节与仿真结果分析,同时参考文中提及的多种优化与估计方法拓展研究思路。
<think>好的,我现在需要回答用户关于NOIP2024第三题的题解请求。首先,我得明确用户的问题是什么。NOIP是全国青少年信息学奥林匹克联赛,2024年的题目目前还没有发布,所以用户可能指的是某个模拟题或者往年的题目,或者是笔误。我需要先确认这一点。 首先,我应该检查是否存在NOIP2024的题目。由于现在是2023年,2024年的比赛还没进行,所以题目不可能已经公开。用户可能是指NOIP2023的第三题,或者可能是其他比赛的题目。也有可能用户提到的题目是某个模拟赛或者训练题中的T3。 接下来,我应该考虑如何处理这种情况。如果用户确实想询问一个尚未存在的题目,我需要礼貌地指出这一点,并建议可能的解释。同时,为了帮助用户,我可以提供一般性的题解思路,或者假设题目类型并给出常见问题的解决方法。 假设用户可能混淆了年份,比如NOIP2023的T3,或者某个省份的省选题。或者用户可能在参加训练,遇到了一道题称为NOIP2024T3的模拟题。这时候,我需要引导用户提供更多信息,或者给出常见题型的解题方法。 另外,用户可能需要的是如何应对类似NOIP中的动态规划、图论、数据结构等常见问题。第三题通常难度较高,可能涉及较复杂的算法。比如,可能是树形DP、线段树、最短路算法变种、状态压缩等。 由于没有具体的题目内容,我需要给出一个通用的解题框架,帮助用户在面对类似问题时如何分析。例如,分步骤解决问题的方法:理解题意、分析输入输出、设计算法、编写代码等步骤。 同时,我可以举一个例子,假设题目是某个经典问题的变种,比如动态规划中的背包问题,或者图论中的最短路径问题,并给出相应的解题思路和代码结构。这样即使用户的问题不明确,也能从中获得有用的信息。 另外,我需要提醒用户在遇到具体题目时,应该注意的关键点,比如数据范围、时间限制、空间限制,这些因素会影响算法的选择。例如,数据量较小时可以用暴力法,而数据量大时需要更高效的算法。 最后,确保我的回答清晰、有条理,并且符合用户的需求。如果用户能提供更多题目细节,我可以给出更精确的解答。但现在的情况下,给出一般性的建议和解题策略是比较合适的。</think>由于NOIP2024尚未举办(当前为2023年),其题目自然不存在。若您指的是某次模拟赛或特定训练题,请补充以下信息以便提供更精准的题解: 1. **题目描述**(关键条件、输入输出格式) 2. **数据范围**(变量数值规模) 3. **示例输入输出** 以下提供通用高阶题型的解题框架供参考: --- ### 典型NOIP-T3级难题解题思路 以**树形动态规划+状态压缩**类问题为例: #### 问题特征 - 给定带权树结构(节点数 $n \leq 1e5$) - 要求选择若干节点满足特定约束(如不相邻) - 目标函数最优化(最大权值和) #### 解题步骤 1. **状态定义** 设 $dp[u][0/1]$ 表示以节点 $u$ 为根的子树,选/不选 $u` 时的最大权值 2. **转移方程** - 不选当前节点:$dp[u][0] += \sum \max(dp[v][0], dp[v][1])$ - 选择当前节点:$dp[u][1] += \sum dp[v][0]$ 3. **复杂度优化** 采用后序遍历实现 $O(n)$ 时间复杂度 #### 代码框架 ```cpp #include <vector> using namespace std; struct Node { int val; vector<int> children; }; pair<int, int> dfs(Node& node, vector<Node>& tree) { int select = node.val, not_select = 0; for (int child : node.children) { auto [c_not, c_sel] = dfs(tree[child], tree); select += c_not; not_select += max(c_not, c_sel); } return {not_select, select}; } int main() { // 构建树结构 // auto [final_not, final_sel] = dfs(root); // cout << max(final_not, final_sel) << endl; } ``` --- 如需具体题目解析,请提供完整题目描述。建议练习方向: 1. 动态规划(状态机模型) 2. 图论算法(网络流、差分约束) 3. 高级数据结构(线段树合并)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值