题目涉及算法:

  • 级数求和:入门题;
  • 选数:搜索;
  • 产生数:搜索、高精度;
  • 过河卒:动态规划。

级数求和

题目链接:https://www.luogu.org/problemnew/show/P1035

开一个for循环,每次加上1/i,知道和 \(\gt K\) 即可。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
double s, K;
int i;
int main() {
cin >> K;
for (i = 1; s <= K; i ++) s += 1. / (double) i;
cout << i-1 << endl;
return 0;
}

选数

题目链接:https://www.luogu.org/problem/P1036

直接搜索遍历所有的情况,再判断每一种情况下的和是否是素数,即可。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int n, k, a[22], ans;
bool is_prime(int a) {
if (a < 2) return false;
for (int i = 2; i *i <= a; i ++)
if (a % i == 0) return false;
return true;
}
void dfs(int pre, int cnt, int tmp) {
if (cnt >= k) {
if (is_prime(tmp)) ans ++;
return;
}
for (int i = pre+1; i <= n-k+cnt; i ++) {
dfs(i, cnt+1, tmp+a[i]);
}
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i ++) cin >> a[i];
dfs(-1, 0, 0);
cout << ans << endl;
return 0;
}

产生数

题目链接:https://www.luogu.org/problemnew/show/P1037

这道题目就是要判断一下 \(0\) 到 \(9\) 这 \(10\) 个数分别能衍生出多少个数。

这里可以用搜索遍历一下,用 \(cnt[i]\) 来表示 \(i\) 可以达到的数的数量。

然后就去遍历一开始给我们的数的每一位,假设第i为对应的数字是 \(a\) ,那么答案将乘上 \(cnt[a]\) 。

最终输出答案即可。

不过由于答案有可能达到 \(30^{10}\) ,所以得用高精度。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
vector<int> g[11];
bool vis[11];
char s[33];
int n, cnt[11], ans[maxn] = { 1 }, tmp[maxn];
void dfs(int u) {
if (vis[u]) return;
vis[u] = true;
int sz = g[u].size();
for (int i = 0; i < sz; i ++) {
int v = g[u][i];
dfs(v);
}
}
void multi(int a) {
memset(tmp, 0, sizeof(tmp));
for (int i = 0; i < maxn; i ++) {
tmp[i] += ans[i] * a;
tmp[i+1] += tmp[i] / 10;
tmp[i] %= 10;
}
for (int i = 0; i < maxn; i ++) ans[i] = tmp[i];
}
int main() {
cin >> s >> n;
while (n --) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
}
for (int i = 0; i <= 9; i ++) {
memset(vis, 0, sizeof(vis));
dfs(i);
if (i == 0) cnt[i] ++;
for (int j = 1; j <= 9; j ++) if (vis[j]) cnt[i] ++;
}
n = strlen(s);
for (int i = 0; i < n; i ++) {
int a = s[i] - '0';
multi(cnt[a]);
}
int i = maxn - 1;
while (!ans[i] && i > 0) i --;
while (i >= 0) cout << ans[i--];
cout << endl;
return 0;
}

过河卒

题目链接:https://www.luogu.org/problem/P1002

这道题目是一道动态规划题。

我们令 \(f[i][j]\) 表示从 \((0,0)\) 走到 \((i,j)\) 的方案数,那么:

  • 如果 \((i,j)\) 对应就是马的位置或者在马的公鸡范围内,则 \(f[i][j] = 0\) ;
  • 否则(注意,这个否则非常重要),如果 \(i=0,j=0\) ,则 \(f[i][j] = 1\) ;
  • 否则,如果 \(i=0\) ,则 \(f[i][j] = f[i][j-1]\) ;
  • 否则,如果 \(j=0\) ,则 \(f[i][j] = f[i-1][j]\) ;
  • 否则,\(f[i][j] = f[i-1][j] + f[i][j-1]\) 。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 22;
int n, m, x, y;
long long f[maxn][maxn];
int main() {
cin >> n >> m >> x >> y;
for (int i = 0; i <= n; i ++) {
for (int j = 0; j <= m; j ++) {
if (x==i && y==j || abs(x-i)==1 && abs(y-j)==2 || abs(x-i)==2 && abs(y-j)==1)
f[i][j] = 0;
else if (!i && !j) f[i][j] = 1;
else if (!i) f[i][j] = f[i][j-1];
else if (!j) f[i][j] = f[i-1][j];
else f[i][j] = f[i-1][j] + f[i][j-1];
}
}
cout << f[n][m] << endl;
return 0;
}

2002年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. LintCode刷题笔记--Longest Increasing Subsequence

    标签: 动态规划 描述: Given a sequence of integers, find the longest increasing subsequence (LIS). You code s ...

  2. 转搞定python多线程和多进程

    转自https://www.cnblogs.com/whatisfantasy/p/6440585.html 1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小 ...

  3. opencv2.4.9配置+VS2013

    参见:浅墨的(红的的为变动部分) http://blog.csdn.net/poem_qianmo/article/details/19809337 本系列文章由@浅墨_毛星云 出品,转载请注明出处. ...

  4. goland的下载安装破解并配置

    1.下载地址:https://www.jetbrains.com/go/ 2.安装:简单 3.破解:https://www.cnblogs.com/igoodful/p/9113946.html 4. ...

  5. Sublime Text 2 快捷键用法大全

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑) Ctrl+G 跳转到相应的行 Ctrl+J 合并行(已选择需要合并的多行时) Ctrl+L 选择整行(按住-继续 ...

  6. 通过IP地址訪问Jbossserver上的应用

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/liu765023051/article/details/28882533 环境介绍 Web项目中.在 ...

  7. PHP验证码文件类

    转自:http://www.blhere.com/1165.html 12345678910111213141516171819202122232425262728293031323334353637 ...

  8. firefox扩展开发(二):用XUL创建窗口控件

    firefox扩展开发(二):用XUL创建窗口控件 2008-06-11 16:57 1.创建一个简单的窗口 <?xml version="1.0"?> <?xm ...

  9. Windows中查看PowerShell版本和virbox版本,vagrant 版本

    我并不是很熟悉什么是PowerShell,但是有种直觉是:如果想在Windows中使用系统自带的功能取代bash shell,PowerShell或许是比DOS批处理更好的选择.不过,从头开始再来一门 ...

  10. poj1087&&hdu1526 最大流

    多源多汇. 比较明显的建图.对于电器,可以从源点与各个电器相连,容量为1,表示这个电器有1个,然后对于各种接头,那可以各个接头与汇点相连,容量为1,表示每个接头只能用一次. 然后对于能够相互转换的接头 ...