题目涉及算法:

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

级数求和

题目链接: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. 使用openpyxl模块时出现错误: zipfile.BadZipFile: File is not a zip file

    通过Pycharm工具新建一个xlsx文件. 再通过openpyxl模块读取该表时,报错: zipfile.BadZipFile: File is not a zip file 如下所示: 解决办法: ...

  2. (实现)vue.js最简实现

    Vue.winward.js vue.js最简实现(the most simple vue.js) 让所有人都看得懂Vue原理 建议看完Vue.winward.js后,结合mpvue源码解读单页应用路 ...

  3. 网页性能测试之WebPageTest

    想知道您的网站,性能怎么样? 很自然,首先得找一个广被认可的测试工具.我们推荐WebPageTest: WebPageTest 它是google 开源项目”make the web faster “的 ...

  4. 【Leetcode】两数之和,三数之和,四数之和

    两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...

  5. SQLServer —— EXISTS子查询

    一.删除数据库 use master go if exists (select * from sysdatabases where name = 'Demo') drop database Demo ...

  6. SPSS详细操作:生存资料的Cox回归分析

    SPSS详细操作:生存资料的Cox回归分析 一.问题与数据 某研究者拟观察某新药的抗肿瘤效果,将70名肺癌患者随机分为两组,分别采用该新药和常规药物进行治疗,观察两组肺癌患者的生存情况,共随访2年.研 ...

  7. Directx11教程(54) 简单的基于GS的billboard实现

    原文:Directx11教程(54) 简单的基于GS的billboard实现     本章我们用一个billboard的实现来学习D3D11中的GS.     在VS shader中,我们输入的是顶点 ...

  8. jmeter测试APP时如何录制脚本

    jmeter录制脚本需要注意的点: (1)手机和电脑需要处于一个局域网内(如手机和电脑所使用一个wifi) (2)设置手机代理的时候手机IP填写本机IP,端口号要和jmeter的相同,一般情况下端口号 ...

  9. bzoj1221 软件开发

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  10. Please upgrade the installed version of powershell to the minimum required version and run the command again.

    版权声明:本文为博主原创文章,转载请注明出处.谢谢 https://blog.csdn.net/cow66/article/details/77993908 我的系统是windows 7 安装了vag ...