题目涉及算法:

  • 数的计算:动态规划;
  • 最大公约数和最小公倍数问题:质因数分解;
  • 求先序排列:递归;
  • 装箱问题:动态规划(纯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普及组复赛题解的更多相关文章

  1. 2010年NOIP普及组复赛题解

    题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...

  2. 2017年NOIP普及组复赛题解

    题目涉及算法: 成绩:入门题: 图书管理员:模拟: 棋盘:最短路/广搜: 跳房子:RMQ/二分答案/DP(本人解法). 成绩 题目链接:https://www.luogu.org/problemnew ...

  3. 2016年NOIP普及组复赛题解

    题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...

  4. 2014年NOIP普及组复赛题解

    题目涉及算法: 珠心算测验:枚举: 比例简化:枚举: 螺旋矩阵:模拟: 子矩阵:状态压缩/枚举/动态规划 珠心算测验 题目链接:https://www.luogu.org/problem/P2141 ...

  5. 2013年NOIP普及组复赛题解

    题目涉及算法: 计数问题:枚举: 表达式求值:栈: 小朋友的数字:动态规划: 车站分级:最长路. 计数问题 题目链接:https://www.luogu.org/problem/P1980 因为数据量 ...

  6. 2011年NOIP普及组复赛题解

    题目涉及算法: 数字反转:模拟: 统计单词数:模拟: 瑞士轮:模拟/排序: 表达式的值:后缀表达式/DP. 数字反转 题目链接:https://www.luogu.org/problem/P1307 ...

  7. 2008年NOIP普及组复赛题解

    题目涉及算法: ISBN号码:简单字符串模拟: 排座椅:贪心: 传球游戏:动态规划: 立体图:模拟. ISBN号码 题目链接:https://www.luogu.org/problem/P1055 简 ...

  8. 2005年NOIP普及组复赛题解

    题目涉及算法: 陶陶摘苹果:入门题: 校门外的树:简单模拟: 采药:01背包: 循环:模拟.高精度. 陶陶摘苹果 题目链接:https://www.luogu.org/problem/P1046 循环 ...

  9. 2018年NOIP普及组复赛题解

    题目涉及算法: 标题统计:字符串入门题: 龙虎斗:数学题: 摆渡车:动态规划: 对称二叉树:搜索. 标题统计 题目链接:https://www.luogu.org/problem/P5015 这道题目 ...

随机推荐

  1. 利用 awk 将当前的链接按端口汇总倒排序

    写了一行命令,利用 awk 将当前的链接按端口汇总倒排序  :) netstat -ano | awk /tcp.*:1[15].*:[1-5]/'{print $4}' | awk -F ':' ' ...

  2. eclipse修改中文注释的字体(亲测有用!)

    Window –> Preferences –> General –> Appearance –> Colors and Fonts –> Basic –> Tex ...

  3. homeworkvue

    两个半圆,点一下转90°,两个颜色 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  4. Vue.之. 动态设置按钮Disabled

    Vue.之. 动态设置按钮Disabled 按钮代码如下: 添加了一个 属性      :disabled="isAble"  ,控制:更新按钮.重置按钮 <el-form- ...

  5. day4_python之三元表达式、列表推导式、生成器表达式

    一.三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 二.列表解析 l = [] for ...

  6. java连接oracle jdbc连接

    Class.forName("oracle.jdbc.driver.OracleDriver"); Connection ct=Driver.Magager.getConnecti ...

  7. datetimepicker —— 日期选择控件

    一.依赖 <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel=&qu ...

  8. 给图片加ALT属性是个什么意思?有什么优点呢

    使用百度统计的seo建议当中一条图片ALT信息"存在没有alt信息的img标签"扣分较多.站点图片中加入ALT对seo有什么优点呢?这是非常多初学seo的朋友们都须要询问的问题.a ...

  9. 关于使用JavaMail发送邮件抛出java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream.<init>(Ljava异常的解决方法

    我们在使用JavaMail时有可能会如下异常: Exception in thread "main" java.lang.NoSuchMethodError: com.sun.ma ...

  10. @loj - 2174@ 「FJOI2016」神秘数

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...