题目涉及算法:

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

级数求和

题目链接: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. 基于遗传算法(Genetic Algorithm)的TSP问题求解(C)

    基于遗传算法的TSP问题求解(C) TSP问题: TSP(Travelling salesman problem): 译作“旅行商问题”, 一个商人由于业务的需要,要到n个城市,每个城市之间都有一条路 ...

  2. 几种支持REST的Java框架

    目前宣称支持REST的Java框架包括以下这些: Restlet(http://www.restlet.org/) Cetia4(https://cetia4.dev.java.net/) Apach ...

  3. oracle国家字符集

    国家字符集是一个备用字符集,利用此字符集可以在没有Unicode 数据库字符集的数据库中存储 Unicode 字符. 选择国家字符集的其它原因如下: 对于频繁的字符处理操作,不同的字符编码方案可能更为 ...

  4. jQuery ajax请求struts action实现异步刷新

    第一步:导入相关jar包,本样例需导入struts相关jar包,json-lib.jar,gson-2.1.jar可以任意选择,但是这里需要都导入,因为为了做测试,两种jar包的转换方式都用到了. 第 ...

  5. CodePlus2017 12月月赛 div2火锅盛宴

    当时看到这道题感觉真是难过,我数据结构太弱啦. 我们来看看需要求什么: 1.当前熟了的食物的最小id 2.当前熟了的食物中有没有编号为id的食物 3.当前没熟的食物中有没有编号为id的食物 4.当前没 ...

  6. jquery的innerWidth 和 innerHeight的使用

    innerWidth This method returns the width of the element, including left and right padding, in pixels ...

  7. 设置脚本sh

  8. 学习iOS设计--iOS8的颜色、文字和布局学习

    在去年,Apple针对新时代用户彻底更新了其设计语言.现在的设计语言相对之前大为简化,能够让设计师将精力集中到动画和功能上,而不是繁复的视觉细节上. 很多人都曾问过我:设计应当如何入门?成为一名优秀设 ...

  9. 四.使用JDBC进行批处理操作

    1 create table testbatch 2 ( 3 id int primary key, 4 name varchar(20) 5 ); 在实际的项目开发中,有时候需要向数据库发送一批SQ ...

  10. FastAdmin CMS 内容管理插件标签文档

    FastAdmin CMS 内容管理插件标签文档 在CMS插件中的前端视图模板中有大量使用了自定义标签,我们在修改或制作模板的时候可以方便快捷的使用自定义标签来调用我们相关的数据. 标签库位于/add ...