2001年NOIP普及组复赛题解
题目涉及算法:
- 数的计算:动态规划;
- 最大公约数和最小公倍数问题:质因数分解;
- 求先序排列:递归;
- 装箱问题:动态规划(纯0-1背包问题)
数的计算
题目链接:https://www.luogu.org/problem/P1028
这道题目可以用动态规划进行求解。
我们令 \(f[i]\) 表示自然数为 \(i\) 能够生成的数的个数,则:
\(f[i] = 1 + \sum_{j=1}^{n/2} f[j]\)
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n, f[maxn];
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
f[i] = 1;
for (int j = 1; j <= i/2; j ++)
f[i] += f[j];
}
cout << f[n] << endl;
return 0;
}
最大公约数和最小公倍数问题
题目链接:https://www.luogu.org/problem/P1029
这道题目虽然名为“最大公约数和最小公倍数问题”,但其实是一道 质因数分解 的问题。
首先,如果P不能整除Q,那么答案肯定为 \(0\) ,直接输出 \(0\) 即可。
其次,我们令 \(n = Q/P\) ,然后对 \(n\) 进行质因数分解,假设对 \(n\) 进行质因数分解的表达式为:
\(n = a_1^{b_1} \times a_2^{b_2} \times \dots \times a_m^{b_m}\)
那么我们知道,对于其中的任意一个 \(a_i\) ,它要么归到 \(x0\) ,要么归到 \(y0\) ,不可能有 \(1\) 个 \(a_i\) 归到 \(x0\) ,而另一个 \(a_i\) 归到 \(y0\) (因为这个时候他们的最大公约数就变成了 \(x0 \times a_i\)) ,所以对于这 \(m\) 个 \(a_i\) ,他们要么都归到 \(x0\) ,要么都归到 \(y0\) ,所以总的方案数就是 \(2^m\) 。
实现代码如下(代码中我用 \(cnt\) 来表示不同的质因数个数):
#include <bits/stdc++.h>
using namespace std;
int n, m, P, Q, cnt;
long long ans = 1;
int main() {
cin >> P >> Q;
if (Q % P) {
puts("0");
return 0;
}
n = Q / P;
m = sqrt(n);
for (int i = 2; i <= m; i ++) {
if (n % i == 0) {
cnt ++;
while (n % i == 0) n /= i;
}
}
if (n > 1) cnt ++;
cout << ( 1LL << cnt ) << endl;
return 0;
}
求先序排列
题目链接:https://www.luogu.org/problem/P1030
这道题目可以用“递归”进行求解。
首先,后续序列的最后一个元素肯定是当前子树的根节点。
我们可以在中序序列里面找到根节点的位置,然后中序序列例根节点左边的子串对应该根节点的左子树,右边的子串对应根节点的右子树。我们递归地进行遍历就可以还原出这棵树。
同时,我们在递归的时候其实也可以直接输出这棵树的先序遍历结果。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
char zx[10], hx[10]; // zx:中序序列;hx:后序序列
// [L1,R1]对应中序序列的区间范围;
// [L2,R2]对应后序序列的区间范围
void dfs(int L1, int R1, int L2, int R2) {
if (L1 >= R1) {
if (L1 == R1) putchar(zx[L1]);
return;
}
int i;
for (i = L1; i <= R1 && zx[i] != hx[R2]; i ++);
putchar(zx[i]);
int l_len = i - L1, r_len = R1 - i;
dfs(L1, i-1, L2, L2+l_len-1);
dfs(i+1, R1, R2-r_len, R2-1);
}
int main() {
cin >> zx >> hx;
int len = strlen(zx);
dfs(0, len-1, 0, len-1);
return 0;
}
装箱问题
题目链接:https://www.luogu.org/problem/P1049
这道题目是一道纯0-1背包问题。
对于第i件物品,我们令它的体积等于价值,套0-1背包模板能够得到能装进箱子的最大价值。以箱子总体积减去总价值就是箱子的最小的剩余空间。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 20020;
int n, V, c, f[maxn];
int main() {
cin >> V >> n;
while (n --) {
cin >> c;
for (int i = V; i >= c; i --)
f[i] = max(f[i], f[i-c] + c);
}
cout << V - f[V] << endl;
return 0;
}
作者:zifeiy
2001年NOIP普及组复赛题解的更多相关文章
- 2010年NOIP普及组复赛题解
题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...
- 2017年NOIP普及组复赛题解
题目涉及算法: 成绩:入门题: 图书管理员:模拟: 棋盘:最短路/广搜: 跳房子:RMQ/二分答案/DP(本人解法). 成绩 题目链接:https://www.luogu.org/problemnew ...
- 2016年NOIP普及组复赛题解
题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...
- 2014年NOIP普及组复赛题解
题目涉及算法: 珠心算测验:枚举: 比例简化:枚举: 螺旋矩阵:模拟: 子矩阵:状态压缩/枚举/动态规划 珠心算测验 题目链接:https://www.luogu.org/problem/P2141 ...
- 2013年NOIP普及组复赛题解
题目涉及算法: 计数问题:枚举: 表达式求值:栈: 小朋友的数字:动态规划: 车站分级:最长路. 计数问题 题目链接:https://www.luogu.org/problem/P1980 因为数据量 ...
- 2011年NOIP普及组复赛题解
题目涉及算法: 数字反转:模拟: 统计单词数:模拟: 瑞士轮:模拟/排序: 表达式的值:后缀表达式/DP. 数字反转 题目链接:https://www.luogu.org/problem/P1307 ...
- 2008年NOIP普及组复赛题解
题目涉及算法: ISBN号码:简单字符串模拟: 排座椅:贪心: 传球游戏:动态规划: 立体图:模拟. ISBN号码 题目链接:https://www.luogu.org/problem/P1055 简 ...
- 2005年NOIP普及组复赛题解
题目涉及算法: 陶陶摘苹果:入门题: 校门外的树:简单模拟: 采药:01背包: 循环:模拟.高精度. 陶陶摘苹果 题目链接:https://www.luogu.org/problem/P1046 循环 ...
- 2018年NOIP普及组复赛题解
题目涉及算法: 标题统计:字符串入门题: 龙虎斗:数学题: 摆渡车:动态规划: 对称二叉树:搜索. 标题统计 题目链接:https://www.luogu.org/problem/P5015 这道题目 ...
随机推荐
- ML面试1000题系列(71-80)
本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 71.看你是搞视觉的,熟悉哪些CV框架,顺带聊聊 ...
- 高效整洁CSS代码原则(上)
CSS学起来并不难,但在大型项目中,就变得难以管理,特别是不同的人在CSS书写风格上稍有不同,团队上就更加难以沟通,为此总结了一些如何实现高效整洁的CSS代码原则: 1. 使用Reset但并非全局Re ...
- Linux 配置yum源(互联网)
Linux 配置yum源(互联网) 环境:操作系统Redhat 7.5 1.卸载现有的yum源 rpm -qa|grep yum|xargs rpm -e --nodeps #移除与原yum有 ...
- vue-waterfall2 基于Vue.js 瀑布流组件
vue-waterfall2 1.宽度自适应,数据绑定特效(适用于上拉加载更多) 2.自定义程度高 3.使用极为简便,适用于PC/移动端 4.提供resize(强制刷新布局-适用于下拉刷新)/mix( ...
- 写GULP遇到的ES6问题详解
Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务.最近复习一下gulp一些基本的写法,在写了一些简单的uglify,rename,concat,clean的处理之 ...
- 在liferay 7中如何删除service builder已经生成的数据库table
在Liferay 7中,加了数据库保护机制,你改了service.xml的结构后,重新运行service builder,并不会帮你生成新的数据库表.然后你发现你在数据库中自己手动删除了表后,重新部署 ...
- CMake学习笔记四-CMake常用命令
CMake常用命令 PROJECT PROJECT(projectname [CXX] [C] [Java]) 指定工程名称,并可指定工程支持的语言.支持语言列表可忽略,默认支持所有语言 SET ...
- 微信小程序 —— wepy 使用 Vant Weapp
一.下载 npm i @vant/weapp -S --production 下载完毕之后,就可以在 node_modules 文件夹里,看见下载的包了. 2.移动文件夹 把刚刚下载的包文件夹下的 l ...
- 公司mysql问题二
这个问题解决:
- 【python小随笔】函数的初始化与私有化
1:初始化 class test(object): def __init__(self,name):#初始化函数 self.name = name#构造初始化一个变量为类的全局变量, 类的所有函数都可 ...